这是代码优先所以我会这样做:
首先- 在代码中创建我想要的类:
public abstract class Location
{
public int ID { get; set; }
public string Name { get; set; }
public ICollection<Stock> StockItems { get; set; }
}
public class Warehouse : Location
{
public int NumberOfLoadingDocks { get; set; }
}
public class Row : Location
{
public int NumberOfShelves { get; set; }
}
public class Stock
{
public int ID { get; set; }
public string SerialNo { get; set; }
public int LocationID { get; set; }
}
然后将它们添加到上下文中:
public partial class MyContext : DbContext
{
public DbSet<Location> Locations { get; set; }
public DbSet<Warehouse> Warehouses { get; set; }
public DbSet<Row> Rows { get; set; }
public DbSet<Stock> Stocks { get; set; }
}
然后在包管理器控制台中:
Add-Migration "Locations"
Update-Database -Script
这让我看到了 Entity Framework 将创建的表:
CREATE TABLE [dbo].[Stocks] (
[ID] [int] NOT NULL IDENTITY,
[SerialNo] [nvarchar](max),
[LocationID] [int] NOT NULL,
CONSTRAINT [PK_dbo.Stocks] PRIMARY KEY ([ID])
)
CREATE INDEX [IX_LocationID] ON [dbo].[Stocks]([LocationID])
CREATE TABLE [dbo].[Locations] (
[ID] [int] NOT NULL IDENTITY,
[Name] [nvarchar](max),
[NumberOfShelves] [int],
[NumberOfLoadingDocks] [int],
[Discriminator] [nvarchar](128) NOT NULL,
CONSTRAINT [PK_dbo.Locations] PRIMARY KEY ([ID])
)
ALTER TABLE [dbo].[Stocks] ADD CONSTRAINT [FK_dbo.Stocks_dbo.Locations_LocationID] FOREIGN KEY ([LocationID]) REFERENCES [dbo].[Locations] ([ID])
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
VALUES (N'201309120832257_Locations'....
与您拥有的表不同。这是Table-per-Hierarchy 继承。如果您对此不满意,那么您需要查看Table Per Type 继承
编辑
要获得 TPT 继承,您可以将 Table 属性添加到继承的类中,如下所示:
[System.ComponentModel.DataAnnotations.Schema.Table("Warehouses")]
public class Warehouse : Location
{
public int NumberOfLoadingDocks { get; set; }
}
[System.ComponentModel.DataAnnotations.Schema.Table("Rows")]
public class Row : Location
{
public int NumberOfShelves { get; set; }
}
现在您可以为每种类型获得单独的表格:
CREATE TABLE [dbo].[Locations] (
[ID] [int] NOT NULL IDENTITY,
[Name] [nvarchar](max),
CONSTRAINT [PK_dbo.Locations] PRIMARY KEY ([ID])
)
CREATE TABLE [dbo].[Rows] (
[ID] [int] NOT NULL,
[NumberOfShelves] [int] NOT NULL,
CONSTRAINT [PK_dbo.Rows] PRIMARY KEY ([ID])
)
CREATE INDEX [IX_ID] ON [dbo].[Rows]([ID])
CREATE TABLE [dbo].[Warehouses] (
[ID] [int] NOT NULL,
[NumberOfLoadingDocks] [int] NOT NULL,
CONSTRAINT [PK_dbo.Warehouses] PRIMARY KEY ([ID])
)
CREATE INDEX [IX_ID] ON [dbo].[Warehouses]([ID])
ALTER TABLE [dbo].[Stocks] ADD CONSTRAINT [FK_dbo.Stocks_dbo.Locations_LocationID] FOREIGN KEY ([LocationID]) REFERENCES [dbo].[Locations] ([ID])
ALTER TABLE [dbo].[Rows] ADD CONSTRAINT [FK_dbo.Rows_dbo.Locations_ID] FOREIGN KEY ([ID]) REFERENCES [dbo].[Locations] ([ID])
ALTER TABLE [dbo].[Warehouses] ADD CONSTRAINT [FK_dbo.Warehouses_dbo.Locations_ID] FOREIGN KEY ([ID]) REFERENCES [dbo].[Locations] ([ID])
如果您对此不满意,您应该查看Table Per Concrete Type Inheritance ...