Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在EntityFrameworkCore2.0中的模型内部使用OnModelCreating?_C#_Model_Entity Framework Core - Fatal编程技术网

C# 如何在EntityFrameworkCore2.0中的模型内部使用OnModelCreating?

C# 如何在EntityFrameworkCore2.0中的模型内部使用OnModelCreating?,c#,model,entity-framework-core,C#,Model,Entity Framework Core,我对实体框架非常陌生,所以请放轻松,但我想让我的模型的fluentapi更接近使用,并将其放在模型对象本身中。我在文档中找不到任何东西,也无法通过Google搜索找到一种内置的方法来实现这一点,因此我想,如果模型中存在一个静态方法,那么我可以通过DbContext.OnModelCreating()方法对其进行调用。下面是我的想法,但无论何时运行添加迁移,还是脚本迁移,即使我先删除了所有迁移,它似乎都不起作用。知道我在这件事上错在哪里吗?或者是更好的方法 Trademark.cs(模型) 我认为

我对实体框架非常陌生,所以请放轻松,但我想让我的模型的fluentapi更接近使用,并将其放在模型对象本身中。我在文档中找不到任何东西,也无法通过Google搜索找到一种内置的方法来实现这一点,因此我想,如果模型中存在一个静态方法,那么我可以通过
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);
    }
}