2012-08-27 49 views
6

我將我的EF POCO項目首先轉換爲代碼。我已經更改了T4模板,以便我的所有實體都使用基類EntityBase,它們爲它們提供了一些與持久性無關的常用功能。繼承EF代碼中的公共基類首先

如果我在EntityBase上使用[NotMapped]屬性,則所有實體都會繼承此屬性,對於任何使用EF的類型,我都會得到一個The type 'X.X.Person' was not mapped

如果我對EntityBase所有屬性[NotMapped],我得到一個EntityType 'EntityBase' has no key defined. Define the key for this EntityType例外

FYI:我用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

嘗試將EntityBase定義爲abstract,如果有可能,並且將NotMapped ...放置在您不想映射的屬性上應該執行操作。

+1

它已經abtract。 – Alireza

+1

@Alireza好吧,你講的CodeFirst和T4模板。這真的是CodeFirst?你能展示你在哪裏以及如何做關係映射?因爲我們在CodeFirst中使用了一個基本的抽象類,並且它工作正常... –

+0

我首先使用了EF數據庫,並使用了POCO。那時我改變了T4,以便我所有的類繼承'EntityBase'。現在我們先切換到代碼,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