2012-04-28 2 views
1

내 웹 사이트에 대한 의견 시스템을 만드는 데 막 시작했습니다. 나는 EF를 사용하고 있으며 내 테이블 몇 개를 Comments 테이블에 바인딩하려고합니다. Car 엔티티와 Bike 엔티티가 별도의 두 테이블에 있다고 말하면이 두 테이블의 주석 모음을 바인딩하고 싶습니다.EF에 내 관심사에 대한 내 의견에 바인딩

CommentID | EntityID | CommentText 

     1  Bike_2 Hello world.. 

     2   Car_2   -- 

     3  Bike_3   -- 

것은 내가 잘 생각하고 : 내 마음에

나는 코멘트 테이블이 포함 것이라는 그림이? 엔티티 프레임 워크에서 어떻게 설정합니까?

감사합니다.

답변

1

은 당신의 생각에 가장 가까운 온다 매핑의 유형은 Table-per-Type (TPT) inheritance mapping입니다

(다음은 4.3.1에 엔티티 프레임 워크 4.1 및 코드 - 일층/DbContext.입니다). 그 결과는 다음과 같습니다

public abstract class EntityWithComments 
{ 
    public int Id { get; set; } 
    public ICollection<Comment> Comments { get; set; } 
} 

public class Comment 
{ 
    public int Id { get; set; } 
    public string CommentText { get; set; } 

    public int EntityId { get; set; } 
    public EntityWithComments Entity { get; set; } 
} 

public class Car : EntityWithComments 
{ 
    public string Manufacturer { get; set; } 
    public string Color { get; set; } 
} 

public class Bicycle : EntityWithComments 
{ 
    public int Weight { get; set; } 
    public bool HasThreeWheels { get; set; } 
} 

EntityWithCommentsCarBicycle 아마도 다른 엔티티의 기본 클래스입니다. 그 결과

public class MyContext : DbContext 
{ 
    public DbSet<EntityWithComments> EntitiesWithComments { get; set; } 
    public DbSet<Comment> Comments { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Car>() 
      .ToTable("Cars"); 

     modelBuilder.Entity<Bicycle>() 
      .ToTable("Bicycles"); 
    } 
} 

데이터베이스에있는 네 개의 테이블이 있습니다 :

  • 제안하지만 EntityId처럼 보이는 Comments 표는 직접 언급하지 것이다 그럼 당신은 파생 DbContext 클래스가 CarsBicycles 테이블 대신 기본 유형 표 EntitiesWithComments을 참조합니다.

  • Id 컬럼 인 추상 기본 클래스를 나타내는 테이블 EntitiesWithComments이 있습니다.

  • Id 테이블에서 Id간에 일대일 공유 기본 키 제약이있는 테이블 CarsEntitiesWithComments

  • Id간에 일대일 공유 기본 키 제약이있는 테이블 Bicycles 그리고 그런 다음 수 EntitiesWithComments

테이블의 Id - 예를 들어 - 모든 파란색 자동차로드 :

012,351을
using (var ctx = new MyContext()) 
{ 
    var blueCars = ctx.EntitiesWithComments.OfType<Car>() 
     .Where(c => c.Color == "Blue") 
     .ToList(); 
} 

Id을 제외한 기본 테이블에는 열이 없으므로 필요한 테이블간에 조인이 없습니다. 생성 된 SQL은 다음과 같이 보입니다 만 파생 된 유형의 테이블을 건 드리면 :

SELECT 
'0X0X' AS [C1], 
[Extent1].[Id] AS [Id], 
[Extent1].[Manufacturer] AS [Manufacturer], 
[Extent1].[Color] AS [Color] 
FROM [dbo].[Cars] AS [Extent1] 
WHERE N'Blue' = [Extent1].[Color] 

(나는이 쿼리에서 이상한 0X0X 값이 EF 반환 된 행이 정말 있는지 확인하기 위해 사용하는 형식 기술자의 종류 것 같다 차, 그러나 나는 확실하지 않다.)

세 바퀴 다음 쿼리가 작동 자신의 의견을 포함하여 모든 자전거를로드하려면 :

using (var ctx = new MyContext()) 
{ 
    var bicyclesWithThreeWheelsWithComments = ctx.EntitiesWithComments 
     .Include(e => e.Comments) 
     .OfType<Bicycle>() 
     .Where(b => b.HasThreeWheels) 
     .ToList(); 
} 
+0

대단히 감사합니다! 나는 지금 EF에서이 전략들 중 어느 것도하지 않았으며, 이제는 thrre 매핑 전략 인 TPH, TPT 및 TPC를 알고 있습니다. 감사합니다! 나는 또한 아마이 아이디어 is'nt가 나의 대본을 위해 아주 좋았던 것을 인정해야하고, that's은 당신이 이것이 나의 생각의 가장 가까운 것이라고 말한 이유 다. :) – Claysson

관련 문제