C# 如何在EntityFrameworkCore2.0中的模型内部使用OnModelCreating?
我对实体框架非常陌生,所以请放轻松,但我想让我的模型的fluentapi更接近使用,并将其放在模型对象本身中。我在文档中找不到任何东西,也无法通过Google搜索找到一种内置的方法来实现这一点,因此我想,如果模型中存在一个静态方法,那么我可以通过C# 如何在EntityFrameworkCore2.0中的模型内部使用OnModelCreating?,c#,model,entity-framework-core,C#,Model,Entity Framework Core,我对实体框架非常陌生,所以请放轻松,但我想让我的模型的fluentapi更接近使用,并将其放在模型对象本身中。我在文档中找不到任何东西,也无法通过Google搜索找到一种内置的方法来实现这一点,因此我想,如果模型中存在一个静态方法,那么我可以通过DbContext.OnModelCreating()方法对其进行调用。下面是我的想法,但无论何时运行添加迁移,还是脚本迁移,即使我先删除了所有迁移,它似乎都不起作用。知道我在这件事上错在哪里吗?或者是更好的方法 Trademark.cs(模型) 我认为
DbContext.OnModelCreating()
方法对其进行调用。下面是我的想法,但无论何时运行添加迁移
,还是脚本迁移
,即使我先删除了所有迁移,它似乎都不起作用。知道我在这件事上错在哪里吗?或者是更好的方法
Trademark.cs(模型)
我认为问题在于modelBuilder.Model.GetType()
返回typeof(IMutableModel)
而不是typeof(商标)
。所以,也许我只需要知道如何从modelBuilder
获取模型的模型类型
注意:如果我放置modelBuilder.Entity().HasIndex(x=>x.Name).IsUnique()
在PartDbContext.OnModelCreating()
中,添加了唯一约束。所以,我知道我至少有一点是对的
更新 对于其他对此感兴趣的人,我决定进一步缩小使用范围,只传递
EntityTypeBuilder
,而不是整个ModelBuilder
PartDbContext.cs
protected override void OnModelCreating( ModelBuilder modelBuilder )
{
foreach( var entityType in modelBuilder.Model.GetEntityTypes() )
{
var method = entityType.ClrType.GetMethod("OnEntityCreating",BindingFlags.Static|BindingFlags.NonPublic);
if( method != null )
{
var entityBuilder = new object[] {
typeof(ModelBuilder)
.GetMethod("Entity",new Type[]{})
.MakeGenericMethod(entityType.ClrType)
.Invoke(modelBuilder,null)
};
method.Invoke(null,entityBuilder);
}
}
}
商标
public class Trademark
{
public string Name { get; set; }
protected static void OnEntityCreating( EntityTypeBuilder<Trademark> entityBuilder )
{
entityBuilder.HasIndex(x=>x.Name).IsUnique();
}
}
公共类商标
{
公共字符串名称{get;set;}
受保护的静态void OnEntityCreating(EntityTypeBuilder entityBuilder)
{
entityBuilder.HasIndex(x=>x.Name).IsUnique();
}
}
您可以通过反射迭代全部并调用自定义方法(如果已定义):
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var parameters = new object[] { modelBuilder };
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
var method = entityType.ClrType.GetMethod("OnModelCreating", BindingFlags.Static | BindingFlags.NonPublic);
if (method != null)
method.Invoke(null, parameters);
}
}
这些代码到底在做什么?查找所有数据库集并在db上生成它们?@MuratCanOĞUZHAN查找所有已发现的实体类型(按照
DbSet
s的约定和导航属性,如文档部分所述)。
public class Trademark
{
public string Name { get; set; }
protected static void OnEntityCreating( EntityTypeBuilder<Trademark> entityBuilder )
{
entityBuilder.HasIndex(x=>x.Name).IsUnique();
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var parameters = new object[] { modelBuilder };
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
var method = entityType.ClrType.GetMethod("OnModelCreating", BindingFlags.Static | BindingFlags.NonPublic);
if (method != null)
method.Invoke(null, parameters);
}
}