我有惯例将[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