Inheritance EF/CD如何覆盖索引属性?

Inheritance EF/CD如何覆盖索引属性?,inheritance,indexing,ef-code-first,Inheritance,Indexing,Ef Code First,我有一个项目,在构建代码优先数据模型时使用了继承。我的所有实体类型都需要一个通用的“上下文id”,用字符串表示: public class EBaseGenericEntity { : [Index("IX_Cid", IsUnique = true)] public virtual string Cid { get; set; } : } 如您所见,“Cid”属性应始终保持唯一值。问题是:有一种实体类型的“Cid”值不必是唯一的,所以我认为这会起作用: pub

我有一个项目,在构建代码优先数据模型时使用了继承。我的所有实体类型都需要一个通用的“上下文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进行属性化,这两个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)
    {
    }
}
然后用它代替“正常”指数属性:

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仍然可以找到它。是否派生的自定义属性也不能覆盖其AttributeUsage?

这是不可能的。由于只有一个实体存在此问题,我建议:

  • 为公共字段定义基本实体
  • 使用Cid字段和unique index属性定义继承的基本实体,并在大多数类型上使用它
  • 从第一个基本实体派生
    EEntityInfo

您还可以定义包含Cid的接口,以便在需要时跨类型使用通用语法。

这是不可能的。由于只有一个实体存在此问题,我建议:

  • 为公共字段定义基本实体
  • 使用Cid字段和unique index属性定义继承的基本实体,并在大多数类型上使用它
  • 从第一个基本实体派生
    EEntityInfo

您还可以定义一个包含Cid的接口,以便在需要时跨类型使用通用语法。

是的,我考虑过,但我有相当多的代码(包括几个通用方法)依赖于实体的继承关系。但是谢谢你的建议。这就是我建议使用接口的原因——如果你能让这些方法在接口上工作,你只需要在EBaseGenericEntity和EEntityInfo上应用它。我在我的项目中使用过这种方法,当我需要对不同基类的类似继承的支持时。事实上,我会在未来的EF/CF项目中记住这一点,但对于这种解决方案来说,我现在走得有点太远了。我最终通过实现自己的db初始值设定项来修复它,该初始值设定项尊重“IndexedAttribute”自定义属性,同时确保它不会被重写属性继承。我仍然认为默认实现(IndexAttribute)存在缺陷,不允许重写属性的使用。是的,我考虑过,但我有相当多的代码(包括几个通用方法)依赖于实体的继承关系。但是谢谢你的建议。这就是我建议使用接口的原因——如果你能让这些方法在接口上工作,你只需要在EBaseGenericEntity和EEntityInfo上应用它。我在我的项目中使用过这种方法,当我需要对不同基类的类似继承的支持时。事实上,我会在未来的EF/CF项目中记住这一点,但对于这种解决方案来说,我现在走得有点太远了。我最终通过实现自己的db初始值设定项来修复它,该初始值设定项尊重“IndexedAttribute”自定义属性,同时确保它不会被重写属性继承。我仍然认为默认实现(IndexAttribute)存在缺陷,不允许重写属性的使用。