是否可以在 EF 6 中将流畅 API 与注释属性混合使用



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

然后我想,如果我做错了什么,而EF正在拯救我的屁股怎么办?我什至不知道。所以我按照这个答案删除了所有约定。代码如下:

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' 未定义键。定义此实体类型的键。

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

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

例外消失了。

看起来,如果你启动Fluent API,你必须把所有东西都放在那里。这是真的吗?还是我做错了什么?

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

相关内容

  • 没有找到相关文章

最新更新