1

我刚刚开始为我的网站创建评论系统。我正在使用 EF,我想将我的一些表绑定到 Comments 表。我们可以说我在两个单独的表中有一个 Car 实体和一个 Bike 实体,我想绑定这两个表的注释集合。

在我的脑海中,我有一张评论表将包含的图片:

CommentID | EntityID | CommentText

      1        Bike_2    Hello world..

      2         Car_2         -- 

      3        Bike_3         --

我想对了吗?如何使用实体框架进行设置?

最好的祝福。

4

1 回答 1

1

(以下适用于 Entity Framework 4.1 到 4.3.1 和 Code-First/ DbContext。)

最接近您的想法的映射类型是Table-per-Type (TPT) 继承映射。它看起来像这样:

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是一个基类CarBicycle也许还有其他实体。然后你有一个派生DbContext类:

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");
    }
}

结果,您在数据库中有四个表:

  • 一个Comments看起来像您的提案但EntityId不直接引用Carsand表的Bicycles表。相反,它指的是基本类型表EntitiesWithComments

  • 表示抽象基类的表EntitiesWithComments,它只有一个列,即Id列。

  • 在表和表Cars之间具有一对一共享主键约束IdIdEntitiesWithComments

  • 在表和表Bicycles之间具有一对一共享主键约束IdIdEntitiesWithComments

然后,您可以 - 例如 - 加载所有蓝色汽车:

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

因为EntitiesWithComments基表不包含任何列,除了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();
}
于 2012-04-29T12:23:07.733 回答