我可以在F6中混合Fluent API和Annotations Attributes吗?

时间:2018-03-09 14:33:56

标签: c# .net entity-framework entity-framework-6 ef-fluent-api

我有惯例将[Key]作为Annotation Attribute放在Entity中,将其余配置放入FluentAPI(主要是ForeignKey)。我工作得很好,但后来我发现EF6有这个"魔术约定",如果名字是特定格式的话我会创建PK或FK(我发现问this问题)。

然后我想,如果我做错了什么并且EF拯救我的屁股怎么办?我甚至都不知道。所以我在this回答后删除了所有约定。这是代码:

private void RemoveAllConventions(DbModelBuilder modelBuilder)
{
    var conventions = AppDomain.CurrentDomain.GetAssemblies()
        .SelectMany(a => a.GetTypes().Where(t => t.IsClass && t.GetInterface("IConvention") != null));

    var remove = typeof(ConventionsConfiguration).GetMethods().Where(m => m.Name == "Remove" && m.ContainsGenericParameters).First();
    foreach (var item in conventions)
    {
        try
        {
            remove.MakeGenericMethod(item).Invoke(modelBuilder.Conventions, null);
        }
        catch (Exception)
        {
        }
    }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    RemoveAllConventions(modelBuilder);
}

之后我得到了例外:

  

CodeFirstNamespace.Item :: EntityType' Item'没有定义键。定义此EntityType的密钥。

事情是...... Item确实有[Key]属性!当我添加:

modelBuilder.Entity<Item>().HasKey(i => i.itemID);

异常消失了。

看起来,如果你启动Fluent API,你必须把所有内容都放在那里。真的吗?或者我做错了什么?

1 个答案:

答案 0 :(得分:1)

问题是您要删除所有加载约定,然后使用Fluent API。您可以自由混合使用注释和Fluent API。他们每个人都有优点和缺点。我在当前的项目中同时使用两者。当然,如果您每次调用OnModelCreating时删除所有约定,那么您将删除所有以前的约定。这包括注释,在系统调用OnModelCreating

之前加载注释