首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架v6中的TPC

实体框架v6中的TPC
EN

Stack Overflow用户
提问于 2017-04-26 11:13:30
回答 1查看 410关注 0票数 1

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

我有一个具有零或多个参数的产品,这些参数将映射到它们自己的表中。然而,我无法让这件事起作用。我一直试图得到正确的映射,然后使用迁移来查看数据库应该是什么样的。我知道这在NHibernate中非常简单,但我被迫使用实体框架v6。

背景

这些是我的实体:

代码语言:javascript
复制
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; }
    }
}

我想将其存储在以下模式中:

怎么做?

我的尝试

表-每班

我尝试使用TPC进行映射:

代码语言:javascript
复制
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,但是它想要创建一个额外的、不需要的表:

代码语言:javascript
复制
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);

我不想要这个。我可以通过移除Product中的Product属性来去除这个属性,但是我不能使用ProductParameters。

我要求的太多了还是有可能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-26 11:46:09

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

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

代码语言:javascript
复制
public abstract class ProductParameterState : EntityState
{
    public int ProductId { get; set; }
    public ProductState Product { get; set; }
}

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

代码语言:javascript
复制
HasMany(x => x.Parameters);

或者更改为

代码语言:javascript
复制
HasMany(e => e.Parameters)
    .WithRequired(e => e.Product)
    .HasForeignKey(e => e.ProductId);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43632569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档