2012-08-27 2 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 예외를 얻을 : 내가 사용 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