은 당신의 생각에 가장 가까운 온다 매핑의 유형은 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; }
}
EntityWithComments
는 Car
및 Bicycle
아마도 다른 엔티티의 기본 클래스입니다. 그 결과
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
클래스가 Cars
및 Bicycles
테이블 대신 기본 유형 표 EntitiesWithComments
을 참조합니다.
Id
컬럼 인 추상 기본 클래스를 나타내는 테이블 EntitiesWithComments
이 있습니다.
Id
테이블에서 Id
간에 일대일 공유 기본 키 제약이있는 테이블 Cars
EntitiesWithComments
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();
}
대단히 감사합니다! 나는 지금 EF에서이 전략들 중 어느 것도하지 않았으며, 이제는 thrre 매핑 전략 인 TPH, TPT 및 TPC를 알고 있습니다. 감사합니다! 나는 또한 아마이 아이디어 is'nt가 나의 대본을 위해 아주 좋았던 것을 인정해야하고, that's은 당신이 이것이 나의 생각의 가장 가까운 것이라고 말한 이유 다. :) – Claysson