2016-05-16 7 views
1

コードの最初のデータモデルを構築する際に継承を使用したプロジェクトがあります。あなたは一意の値を常に保持しなければならない「シド」プロパティを見ることができるようにEF/CD Index属性を上書きする方法は?

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

:物事はすべての私のエンティティタイプは、文字列として表され、共通の「コンテキストID」を、必要とすることです。事はある:「シド」の値が、私はこれが働くだろうと思ったとてもユニークである必要はありませんだ1つのエンティティのタイプがあります:

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

可哀想には、これは不満、Entity Frameworkのつまずくを作りますタイプ 'EEntityInfo'のプロパティ 'Cid'は、名前が 'IX_Cid'で、競合する構成を含む2つのIndexAttributesに属しています。 インデックス属性プロパティ 'IsUnique' = 'True'がインデックス属性プロパティ 'IsUnique' = 'False'と競合しています。

EF/CFでこのようなプロパティの属性を上書きすることはできませんか?

EDIT:

だけの問題ではIndexAttributeが、私はまた異なるAttributeUsageと派生バージョンを宣言しようとした継承(AttributeUsage.Inherited)をサポートするために宣言されているかについてではないことを確認する:

[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がその(継承できない)使い方にもかかわらず、インデックス付きのカスタム属性を見つけることができて奇妙に思えます。派生したカスタム属性もそのAttributeUsageをオーバーライドできないのでしょうか?

答えて

0

これはできません。この問題でちょうど単一のエンティティがありますように、私はお勧めします:

  • はCIDフィールドと継承された基本エンティティと一意のインデックス属性を定義し、ほとんどの上でこれを使用し
  • あなたの共通のフィールドの基本エンティティを定義します種類
  • はあなたEEntityInfo最初の基本エンティティ

また、あなたは必要な場合は、タイプに共通の構文を使用することができるようにシドを含むインタフェースを定義することができますから派生します。

+0

はい、私は考えましたが、エンティティの継承関係に依存するかなりのコード(いくつかの汎用メソッドを含む)があります。しかし、提案に感謝します。 –

+0

これは私がインターフェースを使用することを提案した理由です。代わりにそれらのメソッドをインターフェース上で動作させることができれば、EBaseGenericEntityとEEntityInfoに適用する必要があります。私は私のプロジェクトで、ベースクラスの異なる継承のようなサポートが必要なときに、このアプローチを使用しました。 – Richard

+0

確かに、私は将来のEF/CFプロジェクトのためにそのことを念頭に置いていますが、私はその解決策のために今は少し遠すぎます。私は最終的に、 "IndexedAttribute"カスタム属性を尊重する独自のdb-initializerを実装して、それを修正することができましたが、オーバーライドされたプロパティーに対して継承されないようにしました。私はまだ、デフォルトの実装(IndexAttribute)には、オーバーライドされた属性の使用を許可しない欠陥があると考えています。 –

関連する問題