Entity Framework Code First 不允许Entity直接实现接口
Posted
技术标签:
【中文标题】Entity Framework Code First 不允许Entity直接实现接口【英文标题】:Entity Framework Code First does not allow Entity to implement interface directly 【发布时间】:2012-09-19 22:18:14 【问题描述】:实体框架可以忽略我在实体中实现接口的事实吗?情况是我有一个实现 IModelObject 接口的 Tag 类,它定义了实现它的每个类都需要具有 Id 属性。课程如下:
public class Tag : IModelObject, IEquatable<Tag>
[ScaffoldColumn(false)]
public virtual int Id
get;
set;
[Required]
public virtual string Name
get;
set;
...
我的域模型中的每个实体都实现了 IModelObject。没有基类,只有一个接口。默认映射有效,但在数据库中添加了鉴别器列。而且这个鉴别器不是我的域模型的一部分,所以我的数据库中不需要它。 实现一个接口不是继承,我也在实现一个 IEquatable 接口。那么为什么 Entity Framework 的行为像继承并添加了 Discriminator 列,我怎样才能通过不使用基类或抽象类来避免这种情况呢?
【问题讨论】:
[NotMapped] 属性对您有用吗?您必须在接口的每个实现中对接口定义的每个属性进行设置... modelBuilder.Ignore我对你的推理有点困惑。继承与你的问题无关。您的问题是您的实体包含属性(以及虚拟属性。EF 使用虚拟属性执行特殊操作)。 EF 将为您实体上的每个公共属性创建一个列。我不知道你为什么认为它不应该,因为它就是这样做的。
如果您希望 EF 忽略某个属性,则可以在该属性上使用 [NotMapped]
属性,EF 将忽略它。
【讨论】:
它为每个公共属性创建一个列的东西很好。但它也添加了鉴别器列,EF 的行为就像是每个层次结构的表映射。我已经设法解决了这个问题,你是对的,它与界面无关。问题是我试图实现特殊情况模式(martinfowler.com/eaaCatalog/specialCase.html)并实例化并返回 MissingTag 对象,例如在数据库中找不到具有请求 id 的标签。这就是问题所在,因为它检测到 MissingTag 继承自 Tag,而我错过了这个事实。 虚拟属性也不是问题。我通过添加 modelBuilder.Ignore以上是关于Entity Framework Code First 不允许Entity直接实现接口的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 5.0 Code First全面学习
ADO.NET Entity Framework -Code Fisrt 开篇
转:Entity Framework 5.0 Code First全面学习