【发布时间】:2015-10-01 21:45:10
【问题描述】:
我有一个BaseClass,它是抽象的,有很多抽象属性。
我有十几个(它可能会增长)实体,它们是实体框架的一部分,每个实体都派生自 BaseClass。
我试图避免这样做:
modelBuilder.Entity<Entity1>().HasKey(t => t.Id);
modelBuilder.Entity<Entity2>().HasKey(t => t.Id);
modelBuilder.Entity<Entity3>().HasKey(t => t.Id);
...
对于每个属性和每个实体,因为这看起来非常浪费并且会产生大量代码重复。我尝试通过以下方式获取从 BaseClass 派生的命名空间中的所有实体:
var derivedEntities = Assembly.GetExecutingAssembly().GetTypes().
Where(t => t.Namespace == "My.Entities" && t.IsAssignableFrom(typeof(BaseClass)));
但是,接下来的合乎逻辑的步骤似乎是:
foreach (var entity in derivedEntities)
{
modelBuilder.Entity<entity>().HasKey(t => t.Id);
}
但不会编译,因为
“实体是一个变量,但用作类型”。
【问题讨论】:
-
为什么要明确设置密钥? EF 将名称为
Id或classname+Id的属性推断为键。 -
这是一个公平的观点,密钥不必明确设置,所以它可能是一个不好的例子。但是,还有其他必须映射或忽略的属性,这些属性可能与它们相关联,例如 IsOptional、IsRequired 和/或 HasMaxLength。
标签: c# .net entity-framework ef-fluent-api