4

도와 주시면 감사하겠습니다.엔티티 프레임 워크의 단일 엔티티에 2 개의 테이블 매핑

db : Bill 및 BillItem에 2 개의 테이블이 있습니다. 테이블 BillItem의

Int BillId (PK) 
Int BillTypeId Not Null 
Varchar(5) Usr Not Null 
DateTime Tm Not Null 

구조 :

법안은 원칙 테이블입니다 BillItem 테이블 빌의 의존 한

구조 인 반면,이 테이블은 DB에서 하나 개의 관계에 하나의로 구성되어

Int BillItemId (PK) 
Int ItemId Not Null 
Varchar(5) Usr Not Null 
DateTime Tm Not Null 

나는 또한 완

유창함 API 및 엔티티 프레임 워크 4.1 코드 첫 번째 접근 방식을 사용하여 하나의 POCO 클래스로이 두 테이블을지도하고 싶습니다 t 테이블 열 이름을 구성하여 POCO 클래스에서 다른 속성 이름을 사용합니다 (예 : Bill 대신 Id, Usr 대신 User)

이 데이터베이스는 기존 데이터베이스이므로 수정할 수 없습니다.

어떻게 달성 할 수 있습니까?

감사합니다. (할 수 있다면)

결과 클래스는해야한다 : 이름 바꾸기 열 들어

public int Id {get;set;} 
public int BillTypeId {get;set;} 
public int ItemId {get;set;} 
public string User {get;set;} 
public string User1 {get;set;} 
public DateTime Tm {get;set;} 
public DateTime Tm1 {get;set;} 
+0

POCO 클래스의 어느 인스턴스가 Bill 테이블로 이동해야하며 BillItem 테이블을 만들까요? –

+0

보기를 만들 수 없습니까? 이 적용되는 경우 – ken2k

+0

@lazyberezovsky 다음 클래스 법안은 내가 결과 클래스를 반영하기 위해 내 질문을 편집 한 뷰 – Shpongle

답변

0

, 즉 쉽게 : 여기

[Table("SomeHorribleTableName")] 
    public class MyNiceTableName 
    { 
     [Column("Usr")] 
     public string User { get; set; } 
    } 

내가 .. 필요에뿐만 아니라 개체의 이름을 변경하지했습니다 끔찍한 테이블 이름을 지키십시오. 엔티티에 2 개의 테이블을 매핑하는 것에 대해. 나는 그것이 가능하다고 생각하지 않는다. 여기 참조 : Mapping data from 2 tables to 1 entity - Entity Framework 4

유체 스타일 : 아마 내가 할 수있는 최선의

public class Bill 
    { 
     public int ID { get; set; } 
     public int BillTypeID { get; set; } 
     public string UserName { get; set; } 
     public DateTime Time { get; set; } 
    } 

    public class BillItem 
    { 
     public int ID { get; set; } 
     public int ItemID { get; set; } 
     public string UserName { get; set; } 
     public DateTime Time { get; set; } 
    } 

    internal class BillMap : EntityTypeConfiguration<Bill> 
    { 
     public BillMap() 
     { 
      ToTable("Bills"); 
      HasKey(x => x.ID); 
      Property(x => x.ID).HasColumnName("BillId"); 
      Property(x => x.BillTypeID).IsRequired().HasColumnName("BillTypeId"); 
      Property(p => p.UserName).IsRequired().HasColumnName("Usr"); 
      Property(x => x.Time).IsRequired().HasColumnName("Tm"); 
     } 
    } 

    internal class BillItemMap : EntityTypeConfiguration<BillItem> 
    { 
     public BillItemMap() 
     { 
      ToTable("BillItems"); 
      HasKey(x => x.ID); 
      Property(x => x.ID).HasColumnName("BillItemId"); 
      Property(x => x.ItemID).IsRequired().HasColumnName("ItemId"); 
      Property(p => p.UserName).IsRequired().HasColumnName("Usr"); 
      Property(x => x.Time).IsRequired().HasColumnName("Tm"); 
     } 
    } 

. 두 테이블 모두에서 Usr 열을 처리 할 때는 컨트롤러 클래스/비즈니스 논리 계층에서 처리해야 할 것이 있습니다.

한가지 더 : 위의 구성 클래스에 대한 .. 그래서처럼 DbContext에서 그들을 전화 : 난 당신이 법인 분할 기능을 사용하여 그것을 달성 할 수 있다고 생각

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new BillMap()); 
    modelBuilder.Configurations.Add(new BillItemMap()); 
} 
+0

엄격한 Fluent API를 사용 중이며 데이터 주석이 없습니다 – Shpongle

+0

이 경우 위의 편집을 참조하십시오. – Matt

+0

사용자 속성은 Bill 테이블에서 가져옵니다. 하지만 BillItem 테이블의 User 속성은 어떻습니까? 매핑 방법은 무엇이며, BillItem 테이블에서이 속성을 구성하는 방법은 – Shpongle

0

을하지만 일부 데이터 주석을 사용해야합니다 (더 esacpe) :
경고 : 나는이 방법을 시도하지 않은 있지만, 작업 당신이 가 먼저 좋아하면 IT를 체크 아웃 모르지 : 당신의 BillItem 테이블에 속하는 속성을 주석 단일 도메인 모델 뚜껑 (데이터 주석이 HasColumnName 인).
둘째 : 사용이 질문에 대한이 코드 샘플

public class YourSingleModelClassNameConfiguration : EntityTypeConfiguration<YourSingleModelClassName> { 
    public YourSingleModelClassNameConfiguration() { 

     ToTable("Bill"); Property(param => param.Id).IsRequired().HasColumnName("BillId"); 

     // NOW REPEAT THAT FOR ALL BILL PROPERTIES WITH YOUR REQUIRED ATTRIBUTES (ISREQUIRED OR NOT, LENGTH ...) 

     // NOW THE PROPERTIES YOU NEED TO MAP TO THE BILL ITEMS TABLE GOES INTO THE MAP FUNCTION 
     Map(
     param => 
      { param.Properties(d => new {d.ItemId, d.User1}); m.ToTable("BillItem"); 
      } 
     ); 

     // DON'T FORGET TO MENTION THE REST OF THE PROPERTIES BELONGING TO THE BillItem TABLE INSIDE THE PROPERTIES METHOD IN THE LAST LINE. 

    } 
} 
0

당신은 매우 쉽게 할 수있는 당신이이 옵션을 얻었다. 첫 번째는 엔티티 프레임 워크 (mapping multiple tables to a single entity class in entity framework)를 사용하여 클래스를 매핑하는 것입니다.

두 번째 옵션은 수동으로 수행하는 것입니다. 2 테이블이 따라야하는 제한 사항은 1이 강력한 테이블이어야하고 두 번째 테이블이 약한 테이블이어야한다는 제한 사항입니다 (이렇게하면 1 개씩 만 있어야합니다 강한 테이블에서 약한 것으로) 그렇지 않으면,이 결과는 오브젝트의 콜렉션이 될 것이므로 첫 번째 오브젝트가 필요한 오브젝트인지 아닌지를 결정해야합니다.

약간 빠른 접근 방식을 사용하려는 경우 POCO 개체를 매핑하는 데 자신의 논리를 사용하는 것이 좋습니다. 데이터베이스 테이블과 맵핑 할 2 개의 clases를 작성하고 서비스 오브젝트에서 오브젝트를 빌드하십시오.

결과 LINQ 쿼리는 INNER JOINS를 사용하지 않으므로이 방법이 더 빠릅니다. 하지만 조인은 당신 편에서 지켜 져야합니다.

int i=0; 
// this 2 refer to the 2 different mapped tables in your context database 
var pbdata = _pbdata.GetSingle(p=>p.StrongTableID == StrongTableID); 
var pb = _pb.GetSingle(p=>p.WeakTableID == pbdata.WeakTableID); 
// you can see that i am looking for the StrongTableID in order to select the entity value 

// this is optional but usefull! you can do the 
// "copy" inside a function where in future if the 
// object changes, you can update easily 
ObjectComposite.Map(body, ref pb, ref pbdata); 

// the following proccess needs to be done like this... 
// first save the value in the weak object so 
// the WeakTableID is recorded 
// UPDATE: maybe these 2 should go into a transact for more security... but... ok... 
Save(pb); 
i += this.unitOfWork.Save(); 
pbdata.ProfessionalBodyID = pb.ProfessionalBodyID; 

// once the values for the second objects are set, save it all again. 
Save(pbdata); 
i += this.unitOfWork.Save(); 
return i > 0 ? true : false; 

이 방법은 빠르게하지만 당신은 자신의 모든 것을 제어 할 필요가있다. 좋은 점은 여기에 원하는만큼의 테이블을 매핑 할 수 있다는 것입니다.

도움이 되길 바랍니다!

관련 문제