gpt4 book ai didi

c# - 在每次创建上下文时发出 DbContext.OnModelCreating

转载 作者:行者123 更新时间:2023-11-30 15:26:02 26 4
gpt4 key购买 nike

我首先使用实体​​框架代码来处理我的数据库。我有几个名称不同但结构相同的表,这些表动态出现在数据库中。我如何在运行时将 EntityFramework 映射到其中一个表并使用来自 DbContext 实体的数据?

我为让它发挥作用所做的工作:

例如,我的描述动态创建表结构的类是SetElement

这是我的上下文:

public class DataContext : DbContext
{
public DataContext()
: base("RepositoryConnectionString") { }

string setElementsTableId; // the name of table that need to be dynamicly mapped to

// Enforce model recreating
public DataContext(string setElementsTableId)
: this()
{
this.setElementsTableId = setElementsTableId;
}


/* some other entities */

public DbSet<Entities.SetElement> SetElements { get; set; } // dynamicly mapped entity


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
/* come configurations */

if (!string.IsNullOrEmpty(setElementsTableId))
{
modelBuilder.Entity<Entities.SetElement>().Map(x => x.ToTable(setElementsTableId)); // map SetElements property to dynamicly created table
}
}
}

我如何使用它:

public static void AddSetElements(ICollection<SetElement> setElements, string tableId)
{
using (ctx = new DataContext(tableId)) // configere DataContext to map tableId table for entity SetElements
try
{
var num = ctx.SetElements.Count();
ctx.SetElements.AddRange(setElements);
ctx.SaveChanges();
}
catch (Exception e)
{
}
}

我还有一些方法可以从动态创建的表中获取、更新和删除数据,这些方法与 AddSetElements 相同。

一切都如我所愿,但前提是 AddSetElements 首先运行,因为在第一个创建 DbContext.OnModelCreating 的数据上下文中运行并配置所有映射。但是下一个实例创建不会调用 DbContext.OnModelCreating

所以,我的问题是:每次创建 DataContext 实例时如何调用 DbContext.OnModelCreating 然后我使用 DataContext(string setElementsTableId) 创建它?

我知道,我的问题类似于“EF 中的动态表映射”,但我在结果中没有发现任何问题。

顺便说一下。如果您知道解决我的问题的另一种方法,欢迎您。

最佳答案

有一个内置功能可以解决您的问题:`IDbModelCacheKey;其实现将在您的配置中注册。重点是为您的不同上下文生成不同的 key 。

我会选择类似的东西:

一、配置

public class EntityFrameworkConfiguration: DbConfiguration
{
public EntityFrameworkConfiguration()
{
this.SetModelCacheKey(ctx => new EntityModelCacheKey((ctx.GetType().FullName + ctx.Database.Connection.ConnectionString).GetHashCode()));
}
}

然后是IDbModelCacheKey的实现

public class EntityModelCacheKey : IDbModelCacheKey
{
private readonly int _hashCode;

public EntityModelCacheKey(int hashCode)
{
_hashCode = hashCode;
}

public override bool Equals(object other)
{
if (other == null) return false;
return other.GetHashCode() == _hashCode;
}

public override int GetHashCode()
{
return _hashCode;
}
}

最后,你的 DataContext

public class DataContext : DbContext
{

string setElementsTableId;

// use the setElementsTableId as extended property of the
// connection string to generate a custom key
public DataContext(string setElementsTableId)
: base(ConfigurationManager.ConnectionStrings["RepositoryConnectionString"]
+ "; Extended Properties=\"setElementsTableId=" + setElementsTableId + "\"")
{
this.setElementsTableId = setElementsTableId;
}

public DbSet<Entities.SetElement> SetElements { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
if (!string.IsNullOrEmpty(setElementsTableId))
{
modelBuilder.Entity<Entities.SetElement>().Map(x => x.ToTable(setElementsTableId));
}
}
}

希望对你有帮助

关于c# - 在每次创建上下文时发出 DbContext.OnModelCreating,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30095663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com