2016-05-16 74 views
1

我有一個項目,在構建代碼第一個數據模型時使用了繼承。事情是,我所有的實體類型需要一個共同的「上下文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?

回答

0

這是不可能的。因爲只是這個問題的一個單一的實體,我建議:

  • 定義一個基礎機構爲常見的領域
  • 定義與CID字段和唯一索引屬性繼承的基礎機構,並以此在大多數類型
  • EEntityInfo從第一基站實體

您也可以定義包含熙,這樣就可以使用常見的語法跨越類型,如果你需要一個接口派生。

+0

是的,我認爲,但我有很多代碼(包括幾個通用的方法),依賴於我的實體的繼承關係。但謝謝你的建議。 –

+0

這就是爲什麼我建議使用接口 - 如果您可以使這些方法在接口上工作,您只需要將它應用於EBaseGenericEntity和EEntityInfo。當我需要類似不同基類的繼承類支持時,我在項目中使用了這種方法。 – Richard

+0

事實上,我將爲未來的EF/CF項目記住這一點,但現在對於該解決方案我現在已經走得太遠了。我最終設法通過實現我自己的db-initializer來修復它,這個db-initializer確保「IndexedAttribute」自定義屬性的可用性,同時確保它不會被重寫的屬性繼承。我仍然認爲默認實現(IndexAttribute)有缺陷,不允許重寫屬性使用。 –