【问题标题】:EF/CD how to override Index attribute?EF/CD 如何覆盖索引属性?
【发布时间】:2016-05-17 02:30:30
【问题描述】:

我有一个项目,我在构建代码优先数据模型时使用了继承。问题是我所有的实体类型都需要一个通用的“上下文 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?

【问题讨论】:

    标签: inheritance indexing ef-code-first


    【解决方案1】:

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

    • 为常用字段定义基本实体
    • 使用 Cid 字段和唯一索引属性定义继承的基础实体,并将其用于大多数类型
    • 从第一个基本实体派生您的 EEntityInfo

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

    【讨论】:

    • 是的,我考虑过,但是我有相当多的代码(包括几个泛型方法)依赖于我的实体的继承关系。不过谢谢你的建议。
    • 这就是我建议使用接口的原因——如果你可以让这些方法在接口上工作,你只需要在 EBaseGenericEntity 和 EEntityInfo 上应用它。当我需要不同基类的类继承支持时,我在我的项目中使用了这种方法。
    • 确实,我会在未来的 EF/CF 项目中记住这一点,但对于该解决方案,我现在有点太远了。我最终通过实现我自己的 db-initializer 来修复它,它尊重“IndexedAttribute”自定义属性,同时确保它不会被覆盖的属性继承。我仍然认为默认实现(IndexAttribute)存在缺陷,不允许覆盖属性使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2015-01-08
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多