我有一個項目,在構建代碼第一個數據模型時使用了繼承。事情是,我所有的實體類型需要一個共同的「上下文ID」,表示爲一個字符串:EF/CD如何覆蓋索引屬性?
public class EBaseGenericEntity
{
:
[Index("IX_Cid", IsUnique = true)]
public virtual string Cid { get; set; }
:
}
正如你所看到的「CID」屬性應始終保持唯一值。問題是:有一個誰「熙」值不必須是唯一的,所以我認爲這會工作實體類型:
public class EEntityInfo : EBaseGenericEntity
{
:
[Index("IX_Cid", IsUnique = false)]
public override string Cid { get; set; }
:
}
唉,這使得實體框架蹣跚,抱怨:
'EEntityInfo'類型的屬性'Cid'由兩個包含衝突配置名稱爲'IX_Cid'的IndexAttribute歸屬: 索引屬性'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?
是的,我認爲,但我有很多代碼(包括幾個通用的方法),依賴於我的實體的繼承關係。但謝謝你的建議。 –
這就是爲什麼我建議使用接口 - 如果您可以使這些方法在接口上工作,您只需要將它應用於EBaseGenericEntity和EEntityInfo。當我需要類似不同基類的繼承類支持時,我在項目中使用了這種方法。 – Richard
事實上,我將爲未來的EF/CF項目記住這一點,但現在對於該解決方案我現在已經走得太遠了。我最終設法通過實現我自己的db-initializer來修復它,這個db-initializer確保「IndexedAttribute」自定義屬性的可用性,同時確保它不會被重寫的屬性繼承。我仍然認爲默認實現(IndexAttribute)有缺陷,不允許重寫屬性使用。 –