7

私はデータベースファーストアプローチでEntity Framework 5を使用していますが、私はedmxファイルを使用しています。EntityFramework 5.0の基本クラス/エンティティ

ほとんどのエンティティには6つの共通フィールドがあります。 CreatedAt,などのフィールド今、共通フィールドを持つエンティティのIQueryableにしか適用できない拡張機能としていくつかの機能を実装しました。しかし、私が拡張メソッドを実装すると、それはT型であるので任意のタイプのIQueryableによってアクセスすることができ、タイプTは常に1つの型であることだけを定義できます。

私は、共通のフィールドを持ち、タイプTをその基本タイプとして定義するエンティティに基本クラスを与えることができると考えました。しかし、私はこれをすることができないようです。

これを解決する方法や、私が上で説明したものを実装する方法についてのアイデアはありますか?

答えて

8

基本クラスを作成しないでください。以下のように、インタフェースを作成します。

public interface IMyEntity 
{ 
    DateTime CreatedAt { get; set; } 
    string CreatedBy { get; set; } 
    // Other properties shared by your entities... 
} 

次に、あなたのモデルは次のようになります。

[MetadataType(typeof(MyModelMetadata))] 
public partial class MyModel : IMyEntity 
{ 
    [Bind()] 
    public class MyModelMetadata 
    { 
     [Required] 
     public object MyProperty { get; set; } 

     [Required] 
     public string CreatedBy { get; set; } 
    } 
} 
+0

感謝を:Entity Frameworkのことでテッドは、あなたの非自動生成クラスは次のようになります。 したがって、私はedmxファイルの外にインターフェイスを定義しています。次に、そのインタフェースから実装するエンティティに指示するつもりです。必要なエンティティをすべて手動で編集するのは容易ではありません。edmxファイルを更新するときには、もう一度やり直す必要があります。 – Amila

+2

自動生成されたコードには触れません。それは、部分クラスが使われることになっているものです。 EF内の各エンティティの部分クラス(モデルフォルダの下)を作成します。ここで、(データ注釈の)モデルのMetadataTypeを定義できます。更新された回答を参照してください。 – ataravati

+0

はい、私は現時点でMetadataTypeを使用しています。しかし、エンティティに基本クラスを与えるなどの簡単な方法があると思った場合、ダイアグラム内にインタフェースを与えることができれば、より良いことになります。とにかく、私はすべてのエンティティの部分クラスを定義しなければならないようになります。あなたに素早い助けをありがとう – Amila

2

私はのファンだ:次に

public interface IShared 
{ 
    DateTime CreatedOn { get; set; } 
} 

public interface ISharedValidation 
{ 
    [Required] 
    DateTime CreatedOn { get; set; } 
} 


public interface IMyEntity: IShared 
{ 
    // Entity Specifics 
    string Username { get; set; } 
} 

public interface IMyEntityValidation: ISharedValidation 
{ 
    [Required] 
    string Username { get; set; } 
} 

、あなたのモデルになります

[MetadataType(typeof(IMyEntityValidation))] 
public partial class MyModel : IMyEntity 
{ 
    public object CreatedOn { get; set; } 
    public string Username { get; set; } 
} 

もしT4属あなたの迅速な対応のために一般的に

[MetadataType(typeof(IMyEntityValidation))] 
public partial class MyModel : IMyEntity 
{ 
} 

it is not recommended to use Bind in Asp.Net MVC.