1

我正在尝试在实体框架中做一件非常简单的事情。

我有一个具有零个或多个参数的产品,这些参数将映射到它们自己的表中。但是,我无法让它工作。我一直在尝试正确映射,然后使用迁移来查看数据库应该是什么样子。我知道这在 NHibernate 中非常简单,但我被迫违背自己的意愿使用 Entity Framework v6。

背景

这些是我的实体:

namespace Entities
{
    public class EntityState
    {
        public int Id { get; set; }
    }

    public class ProductState : EntityState
    {
        public virtual ICollection<ProductParameterState> Parameters { get; set; }
    }

    public abstract class ProductParameterState : EntityState
    {
    }

    public class ColorParameterState : ProductParameterState
    {
        public virtual string Color { get; set; }
    }

    public class SizeParameterState : ProductParameterState
    {
        public virtual int Size { get; set; }
    }
}

我想将其存储在以下架构中:

ERD

这个怎么做?

我的尝试

每类表

我尝试使用 TPC 进行映射:

namespace Mappings
{
    public class ProductMap : EntityTypeConfiguration<ProductState>
    {
        public ProductMap()
        {
            HasKey(x => x.Id);
            Property(x => x.Name);
            HasMany(x => x.Parameters);
        }
    }

    public class ColorParameterMap : EntityTypeConfiguration<ColorParameterState>
    {
        public ColorParameterMap()
        {
            HasKey(x => x.Id);
            Property(x => x.Color);
            Map(x =>
            {
                x.ToTable("ColorParameters");
                x.MapInheritedProperties();
            });
        }
    }

    public class SizeParameterMap : EntityTypeConfiguration<SizeParameterState>
    {
        public SizeParameterMap()
        {
            HasKey(x => x.Id);
            Property(x => x.Size);
            Map(x =>
            {
                x.ToTable("SizeParameters");
                x.MapInheritedProperties();
            });
        }
    }
}

但这给出了错误The association 'ProductState_Parameters' between entity types 'ProductState' and 'ProductParameterState' is invalid. In a TPC hierarchy independent associations are only allowed on the most derived types.

不要使用继承策略

所以我试图删除MapInheritedProperties,但它想创建一个额外的、不需要的表:

CreateTable(
    "dbo.ProductParameterStates",
    c => new
        {
            Id = c.Int(nullable: false, identity: true),
            ProductState_Id = c.Int(),
        })
    .PrimaryKey(t => t.Id)
    .ForeignKey("dbo.ProductStates", t => t.ProductState_Id)
    .Index(t => t.ProductState_Id);

我不想要这个。Parameters我可以通过删除 中的属性来摆脱这个Product,但是我无法使用Parametera 的 s Product

我要求太多还是有可能?

4

1 回答 1

1

您可以使用 TPC,但关系必须是双向的,并定义了明确的 FK(我猜这与错误消息中提到的“独立关联”相反)。

将反向导航属性和 FK 属性添加到您的基本实体:

public abstract class ProductParameterState : EntityState
{
    public int ProductId { get; set; }
    public ProductState Product { get; set; }
}

并使用与您第一次尝试相同的实体配置,除了ProductMap您删除以下内容的位置

HasMany(x => x.Parameters);

或将其更改为

HasMany(e => e.Parameters)
    .WithRequired(e => e.Product)
    .HasForeignKey(e => e.ProductId);
于 2017-04-26T11:46:09.007 回答