0

能否实体框架,忽略了我在实体实现接口的事实呢?情况是我有一个实现了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。没有基类,只有一个接口。默认映射工作,但在数据库Discriminator列中添加。而这个鉴别器不是我的域模型的一部分,所以我不需要它在我的数据库中。
实现一个接口不继承,我也实现了IEquatable接口。那么为什么实体框架的行为就像这是继承,并添加了Discriminator列,并且如何通过不使用基类或抽象类来避免这种情况?

+0

是否适合你的[NotMapped]属性的工作?你必须设置上通过在接口的每个实现接口(一个或多个)中定义的每个属性... – Mufaka

+0

modelBuilder.Ignore 解决了这个问题,我没有提到的MissingTag类的问题,因为我忘了或者没有想到与这个问题有关。 – gljivar

回答

1

我有点困惑你的推理。继承与你的问题无关。你的问题是你的实体包含属性(和虚拟属性),EF用虚拟属性做特殊的事情。 EF将为您的实体上的每个公共财产创建一个列。我不知道为什么你认为它不应该,因为它就是这样。

如果你想EF忽略的属性,那么您可以使用属性的[NotMapped]属性,EF会忽略它。

+0

它为每个公共属性创建了一列,这很好。但它也添加了Discriminator列,EF的行为就像是按照层次结构映射表一样。我设法解决了这个问题,你是对的,它与界面无关。问题在于我试图实现特殊病例模式(http://martinfowler.com/eaaCatalog/specialCase.html),并将MissingTag对象实例化并返回(例如,在数据库中找不到具有所请求的标识的标签。那就是问题所在,因为它检测到MissingTag继承自标签,而我错过了这一事实。 – gljivar

+0

虚拟属性也不是问题。我已经通过添加modelBuilder.Ignore 来解决所有问题。我需要虚拟属性来返回Id和Name的特殊值。 – gljivar