C# 无法获取每类型表(TPT)继承策略-代码优先迁移
我上课了C# 无法获取每类型表(TPT)继承策略-代码优先迁移,c#,entity-framework,migration,ef-fluent-api,C#,Entity Framework,Migration,Ef Fluent Api,我上课了 public class Company { public int Id { get; set; } public string Name { get; set; } public DateTime CreatedOn { get; set; } public DateTime? DeactivatedOn { get; set; } public DateTime? UpdatedOn { get; set; } public bool
public class Company
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime? DeactivatedOn { get; set; }
public DateTime? UpdatedOn { get; set; }
public bool IsActive { get; set; }
}
public class Supplier : Company
{
public int ContactId { get; set; }
public int DocumentId { get; set; }
public int CompanyId { get; set; }
public virtual Company Company { get; set; }
}
这些是映射
public class CompanyMap : EntityTypeConfiguration<Company>
{
public CompanyMap()
{
// Primary Key
HasKey(c => c.Id);
//Table
ToTable("Company");
}
}
public class SupplierMap : EntityTypeConfiguration<Supplier>
{
public SupplierMap()
{
// Primary Key
HasKey(s => s.Id);
// Properties
//Relationship
HasRequired(s => s.Company)
.WithMany().HasForeignKey(c => c.CompanyId);
//Table
ToTable("Supplier");
}
}
公共类公司映射:EntityTypeConfiguration
{
上市公司地图()
{
//主键
HasKey(c=>c.Id);
//桌子
ToTable(“公司”);
}
}
公共类供应商映射:EntityTypeConfiguration
{
公共供应商地图()
{
//主键
HasKey(s=>s.Id);
//性质
//关系
需要(s=>s公司)
.WithMany().HasForeignKey(c=>c.CompanyId);
//桌子
ToTable(“供应商”);
}
}
这就是背景
public class MyContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new CompanyMap());
modelBuilder.Configurations.Add(new SupplierMap());
}
public DbSet<Company> Companies { get; set; }
public DbSet<Supplier> Suppliers { get; set; }
}
公共类MyContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Configurations.Add(newcompanymap());
modelBuilder.Configurations.Add(newsuppliermap());
}
公共数据库集公司{get;set;}
公共数据库集提供者{get;set;}
}
播种:
var companies = new List<Company>
{
new Company {Id = 1, Name = "X", CreatedOn = DateTime.Now, IsActive = true, UpdatedOn = DateTime.Now},
new Company {Id = 2, Name = "XX", CreatedOn = DateTime.Now, IsActive = true, UpdatedOn = DateTime.Now},
new Company {Id = 3, Name = "XXX", CreatedOn = DateTime.Now, IsActive = true, UpdatedOn = DateTime.Now},
new Company {Id = 4, Name = "XXXX", CreatedOn = DateTime.Now, IsActive = true, UpdatedOn = DateTime.Now},
};
foreach (var item in companies)
{
context.Companies.AddOrUpdate(item);
}
var suppliers = new List<Supplier>
{
new Supplier {Id = 1, CreatedOn = DateTime.Now, Company = companies[0], IsActive = true, UpdatedOn = DateTime.Now},
new Supplier {Id = 2, CreatedOn = DateTime.Now, Company = companies[1], IsActive = true, UpdatedOn = DateTime.Now},
new Supplier {Id = 3, CreatedOn = DateTime.Now, Company = companies[2], IsActive = true, UpdatedOn = DateTime.Now},
new Supplier {Id = 4, CreatedOn = DateTime.Now, Company = companies[3], IsActive = true, UpdatedOn = DateTime.Now}
};
foreach (var item in suppliers)
{
context.Suppliers.AddOrUpdate(item);
}
this.SaveChanges(context);
var公司=新列表
{
新公司{Id=1,Name=“X”,CreatedOn=DateTime.Now,IsActive=true,UpdatedOn=DateTime.Now},
新公司{Id=2,Name=“XX”,CreatedOn=DateTime.Now,IsActive=true,UpdatedOn=DateTime.Now},
新公司{Id=3,Name=“XXX”,CreatedOn=DateTime.Now,IsActive=true,UpdatedOn=DateTime.Now},
新公司{Id=4,Name=“XXXX”,CreatedOn=DateTime.Now,IsActive=true,UpdatedOn=DateTime.Now},
};
foreach(公司中的var项目)
{
context.companys.AddOrUpdate(项目);
}
var供应商=新列表
{
新供应商{Id=1,CreatedOn=DateTime.Now,Company=companys[0],IsActive=true,UpdatedOn=DateTime.Now},
新供应商{Id=2,CreatedOn=DateTime.Now,Company=companys[1],IsActive=true,UpdatedOn=DateTime.Now},
新供应商{Id=3,CreatedOn=DateTime.Now,Company=companys[2],IsActive=true,UpdatedOn=DateTime.Now},
新供应商{Id=4,CreatedOn=DateTime.Now,Company=companys[3],IsActive=true,UpdatedOn=DateTime.Now}
};
foreach(供应商中的var项目)
{
上下文。供应商。添加或更新(项目);
}
保存更改(上下文);
我期望的是两个表都继承了相同的属性(基类和继承类),但我不能这样做,我的结果是一个带有[Discriminator]collunn的表
任何帮助都是非常受欢迎的
关于强制TPT足以指定ToTable,因此我复制/粘贴了您的代码,一切都如预期的那样 这里使用EF 6.1.3-40302创建表语句
CREATE TABLE [Company] (
[Id] int not null identity(1,1)
, [Name] text null
, [CreatedOn] datetime not null
, [DeactivatedOn] datetime null
, [UpdatedOn] datetime null
, [IsActive] bit not null
);
ALTER TABLE [Company] ADD CONSTRAINT [PK_Company_65cc9e90] PRIMARY KEY ([Id])
CREATE TABLE [Supplier] (
[Id] int not null
, [ContactId] int not null
, [DocumentId] int not null
, [CompanyId] int not null
);
ALTER TABLE [Supplier] ADD CONSTRAINT [PK_Supplier_65cc9e90] PRIMARY KEY ([Id])
CREATE INDEX [IX_Id] ON [Supplier] ([Id])
CREATE INDEX [IX_CompanyId] ON [Supplier] ([CompanyId])
ALTER TABLE [Supplier] ADD CONSTRAINT [FK_Supplier_Company_Id] FOREIGN KEY ([Id]) REFERENCES [Company] ([Id])
ALTER TABLE [Supplier] ADD CONSTRAINT [FK_Supplier_Company_CompanyId] FOREIGN KEY ([CompanyId]) REFERENCES [Company] ([Id])
您确定这正是您运行的代码吗?代码上有一个错误,因此您的原始代码可能不同