コードの最初のデータモデルを構築する際に継承を使用したプロジェクトがあります。あなたは一意の値を常に保持しなければならない「シド」プロパティを見ることができるように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をオーバーライドできないのでしょうか?
はい、私は考えましたが、エンティティの継承関係に依存するかなりのコード(いくつかの汎用メソッドを含む)があります。しかし、提案に感謝します。 –
これは私がインターフェースを使用することを提案した理由です。代わりにそれらのメソッドをインターフェース上で動作させることができれば、EBaseGenericEntityとEEntityInfoに適用する必要があります。私は私のプロジェクトで、ベースクラスの異なる継承のようなサポートが必要なときに、このアプローチを使用しました。 – Richard
確かに、私は将来のEF/CFプロジェクトのためにそのことを念頭に置いていますが、私はその解決策のために今は少し遠すぎます。私は最終的に、 "IndexedAttribute"カスタム属性を尊重する独自のdb-initializerを実装して、それを修正することができましたが、オーバーライドされたプロパティーに対して継承されないようにしました。私はまだ、デフォルトの実装(IndexAttribute)には、オーバーライドされた属性の使用を許可しない欠陥があると考えています。 –