EF / CD如何覆盖Index属性?

时间:2016-05-16 17:00:48

标签: inheritance indexing ef-code-first

我有一个项目,我在构建Code第一个数据模型时使用了继承。事情是我的所有实体类型都需要一个共同的“上下文id”,表示为字符串:

public class EBaseGenericEntity
{
    :
    [Index("IX_Cid", IsUnique = true)]
    public virtual string Cid { get; set; }
    :
}

正如您所看到的,“Cid”属性应始终包含唯一值。问题是:有一个实体类型的'Cid'值不必是唯一的,所以我认为这样可行:

public class EEntityInfo : EBaseGenericEntity
{
    :
    [Index("IX_Cid", IsUnique = false)]
    public override string Cid { get; set; }
    :
}
唉,这让实体框架绊倒,抱怨:

类型'EEntityInfo'上的属性'Cid'归因于两个名为'IX_Cid'的IndexAttributes,其中包含冲突的配置:     索引属性属性'IsUnique'='True'与索引属性属性'IsUnique'='False'冲突。

是否无法在EF / CF中覆盖此属性的属性?

编辑:

只是为了确保问题不是关于如何声明IndexAttribute来支持继承(AttributeUsage.Inherited)我还尝试使用不同的AttributeUsage声明派生版本:

[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
public class IndexedAttribute : IndexAttribute
{
    public IndexedAttribute(string name)
        : base(name)
    {
    }
}

然后使用它而不是'普通'IndexAttribute:

public class EBaseGenericEntity
{
    :
    [Indexed("IX_Cid", IsUnique = true)]
    public virtual string Cid { get; set; }
    :
}

public class EEntityInfo : EBaseGenericEntity
{
    :
    [Indexed("IX_Cid", IsUnique = false)]
    public override string Cid { get; set; }
    :
}

然而这并没有帮助。我觉得奇怪的是EF尽管有(不可继承的)用法,但仍可以找到Indexed自定义属性。派生的自定义属性是否也无法覆盖其AttributeUsage?

1 个答案:

答案 0 :(得分:0)

这是不可能的。因为只有一个实体有这个问题,我建议:

  • 为公共字段定义基础实体
  • 使用Cid字段和唯一索引属性定义继承的基本实体,并在大多数类型
  • 上使用它
  • 从第一个基本实体
  • 中获取EEntityInfo

您还可以定义包含Cid的界面,以便在需要时可以使用不同类型的通用语法。