0

据我了解,Table Per Hierarchy 首先是 asp.net mvc 代码中的默认值(?)。然而,当我创建一个抽象基类和两个空子类时,迁移想要创建两个单独的表,而不是一个带有鉴别器列的表。

public abstract class ShippingBase : Entity
{
    public ShippingBase()
    { }

    public bool IsDefault { get; set; }
}

public class Shipping : ShippingBase
{
    public Shipping():base()
    { }
}

public class FlatRateShipping : ShippingBase
{
    public FlatRateShipping():base()
    { }
}

我将两个子类添加到 db 上下文中:

public virtual IDbSet<Localization.Shipping> Shippings { get; set; }
public virtual IDbSet<Localization.FlatRateShipping> FlatRateShippings { get; set; }

而且我在 OnModelCreating 中什么也不做。

我正在使用 ASP.NET Boilerplate,但据我所知,它不会更改任何会产生此结果的设置。我知道如何强制 TPC,但由于 TPH 是默认设置,我还没有找到任何设置它的方法。有什么办法可以强制TPH吗?还是我的课程遗漏了什么?

这是由此产生的迁移:

public override void Up()
    {
        CreateTable(
            "dbo.FlatRateShippings",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    IsDefault = c.Boolean(nullable: false),
                })
            .PrimaryKey(t => t.Id);

        CreateTable(
            "dbo.Shippings",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    IsDefault = c.Boolean(nullable: false),
                })
            .PrimaryKey(t => t.Id);

    }
4

1 回答 1

1

那是因为它们继承自抽象类。抽象类没有资格映射到表,因为它们永远不能被自己实例化。您可以在继承链中有一个抽象类,但只有从它派生的第一个具体类才能获得一个表。例如,如果您FlatRateShipping继承 from Shipping,则两者的数据都将以dbo.Shippings(默认复数形式)结束。

FlatRateShipping如果继承自没有意义Shipping(因为它们在逻辑上是兄弟姐妹,而不是父子),那么Shipping这个名字真的太笼统了。将其重命名为更能描述其实际含义的名称,然后简单地制作两者都可以继承Shipping的具体实现。ShippingBase

如果这些都不符合您的喜好,您可以简单地ShippingBase不抽象并获得相同的结果(尽管dbo.ShippingBases默认情况下您的表格是)。

于 2016-05-16T14:55:40.953 回答