2012-08-27 13 views
6

私は自分のEF POCOプロジェクトをコードに変換しています。 T4テンプレートを変更したので、すべてのエンティティで基本クラスEntityBaseを使用して、永続性に関連しない共通の機能をいくつか提供します。EFコードで共通の基底クラスを継承する

EntityBase[NotMapped]属性を使用すると、すべてのエンティティがこの属性を継承し、EFで使用しようとするすべてのタイプのThe type 'X.X.Person' was not mappedが得られます。私はEntityBaseのすべてのプロパティに[NotMapped]を使用する場合は

が、私は

FYI EntityType 'EntityBase' has no key defined. Define the key for this EntityType例外を取得:私が使用Efの4.3.1

編集:コードの一部:

[DataContract(IsReference = true)] 
public abstract class EntityBase : INotifyPropertyChanged, INotifyPropertyChanging 
{ 
    [NotMapped] 
    public virtual int? Key 
    { 
     get { return GetKeyExtractor(ConversionHelper.GetEntityType(this))(this); } 
    } 
    //other properties and methods! 
} 

[DataContract(IsReference = true), Table("Person", Schema = "PER")] 
public abstract partial class Person : BaseClasses.EntityBase, ISelfInitializer 
{ 
    #region Primitive Properties 
    private int? _personID; 
    [DataMember,Key] 
    public virtual int? PersonID 
    { 
     get{ return _personID; } 
     set{ SetPropertyValue<int?>(ref _personID, value, "PersonID"); } 
    } 
} 

これらのtw oクラスには流暢なapi設定がありません。

答えて

4

EntityBaseabstractと定義してください。可能であれば、NotMapped ...を地図にしたくないプロパティに入力してください。

+1

すでにabtractです。 – Alireza

+1

@Alirezaまあ、あなたはCodeFirstとT4テンプレートを話します。これは本当にCodeFirstですか?リレーションシップマッピングの場所と方法を表示できますか?私たちはCodeFirstで基本抽象クラスを使用しているので、正常に動作しています... –

+0

私はEFデータベースを最初に使用し、POCOを使用しました。その時私はすべてのクラスが 'EntityBase'を継承するようにT4を変更しました。コードに最初に切り替えたので、T4はもう存在しません。 – Alireza

3

すべてのエンティティが共有するEntityBaseのテーブル(これについての偉大なブログ記事:Table Per Type Inheritence)を作成しようとしていますか、またはすべてのエンティティが同じメソッドを使用できるように単純にベースオブジェクトを作成していますか?上記のコードには何の問題もありませんでした。ここでは簡単なテストアプリの全体だ:

このテーブル/データベースを作成し
[DataContract(IsReference = true)] 
public abstract class EntityBase 
{ 
    [NotMapped] 
    public virtual int? Key 
    { 
     get { return 1; } //GetKeyExtractor(ConversionHelper.GetEntityType(this))(this); } 
    } 
    // other properties and methods! 
} 

[DataContract(IsReference = true)] 
public partial class Person : EntityBase 
{ 
    private int? _personID; 
    [DataMember, Key] 
    public virtual int? PersonID 
    { 
     get { return _personID; } 
     set { _personID = value; } 
    } 
} 

public class CFContext : DbContext 
{ 
    public DbSet<Person> Employers { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Person p = new Person(); 
     Console.WriteLine(p.Key); 
    } 
} 

enter image description here

+1

ありがとうございます。はい、私は基本クラスを作成したいと思います。 'EntityBase'からの継承はデータベースレベルでは起こりません。残念ながら、完全なコードは大きすぎてどこかにアップロードできません。私はこれが私のコードではうまくいかない理由を試してみるべきです。 – Alireza

関連する問題