2

我有类似下面的课程。我想重用类并将它们保存在不同的表中,首先使用实体​​框架代码。

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsAvailable { get; set; }
    public List<Part> Parts { get; set; }
    public List<Promotion> Promotions { get; set; }
}

public class Field
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

public class Part
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Field> Details { get; set; }
}

public class Promotion
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Field> Details { get; set; }
}

我想以这样的方式映射我的实体,以便生成如下所示的数据库表。

产品: ID、名称、IsAvailable

ProductParts: ID、名称、ProductId

ProductPartDetails: ID、名称、值、ProductPartId

ProductPromotions: ID、名称、ProductId

ProductPromotionDetails: ID、名称、值、ProductPromotionId

我在这里真正感兴趣的是我希望重用Field类并将其存储在不同的表ProductPartDetailsProductPromotionDetails中,如上所述。有可能还是我的方法需要改变?

4

1 回答 1

1

你可以——但你需要重新安排一切。

您应该制作多对手动“手动”(定义自定义类,如 ProductPartDetails 等),

为它定义流利的配置

例如(更多伪代码)

[ComplexType()]
public class Field
{}
public class ProductPartDetails
{
    public int ProductId { get; set; }
    public int PartId { get; set; }
    public virtual Product Product { get; set; }
    public virtual Part Part { get; set; }
    public Field Field { get; set; }
}
modelBuilder.Entity<ProductPartDetails>()
    .HasKey(x => new { x.ProductId, x.PartId });

modelBuilder.Entity<ProductPartDetails>()
    .HasRequired(i => i.Product)
    .WithMany(u => u.Details)
    .HasForeignKey(i => i.ProductId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<ProductPartDetails>()
    .HasRequired(i => i.Part)
    .WithMany(u => u.Details)
    .HasForeignKey(i => i.PartId)
    .WillCascadeOnDelete(false);

Details现在指向而ProductPartDetails不是 .Field

...并Field作为属性添加到该表中。

制作字段 ComplexType 以便“重用”(仅转换为字段,而不是单独的表格)。两者都是这样的。

例如,带有附加数据的 EF 代码优先多对多

连接表ASP.Net MVC 3 EF中的 Code First Fluent API 和导航属性“在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径”

于 2013-04-08T15:19:06.413 回答