C# 在鉴别器列上,将链接表添加到实体框架生成的表中
我有以下代码结构:C# 在鉴别器列上,将链接表添加到实体框架生成的表中,c#,entity-framework,C#,Entity Framework,我有以下代码结构: class Car class Honda : Car class Toyota : Car 当然,这会在Cars表中生成一个Discriminator列。因此,我们有如下记录: 汽车表格: Id Discriminator Color --------------------------- 1 Honda Yellow 2 Honda Red 3 Toyota Yellow CarTyp
class Car
class Honda : Car
class Toyota : Car
当然,这会在Cars
表中生成一个Discriminator
列。因此,我们有如下记录:
汽车表格:
Id Discriminator Color
---------------------------
1 Honda Yellow
2 Honda Red
3 Toyota Yellow
CarType Amount
------------------
Toyota 10000
Honda 11000
现在,我想做的是扩展汽车
信息,通过添加每个品牌/型号的价格
。但它应该是一个映射表,因为它是每个汽车制造的,而不是每个汽车“实例”(记录)
比如:
carprice表格:
Id Discriminator Color
---------------------------
1 Honda Yellow
2 Honda Red
3 Toyota Yellow
CarType Amount
------------------
Toyota 10000
Honda 11000
基本上,我想要一辆车.Price.Amount
属性,对于本田
,它会给我11000
的值
我想我可以做以下“映射”:
public class CarPrice
{
public CarPrice(Car car, int amount)
{
var carType = car.GetType();
if (carType.BaseType != null && carType.Namespace == "System.Data.Entity.DynamicProxies")
{
// Get rid of the EF dynamic proxy wrapper
carType = carType.BaseType;
}
this.CarType = carType.Name;
this.Amount = amount;
}
protected CarPrice()
{
// Required by EF
}
[Required]
public int Amount { get; private set; }
[Key]
public string CarType { get; private set; }
}
但我不知道如何在车上创建价格属性,该属性基于其鉴别器
映射到CarPrice
class Car
{
// ...
// TODO: I only need 'get'
public virtual CarPrice Price { get; }
}
我必须避免在Cars
表中添加一个新列,因此链接必须发生在现有记录的Discriminator
列上
我将如何处理这个问题?也许我可以使用Fluent API将car.Price
属性映射到自定义SQL查询,或者以某种方式将其指向CarPrices
表
我觉得解决办法是围绕着这个问题的。这里没有什么特别的。只需将鉴别器添加为实体属性,就可以将其用于外键属性
乙二醇
使用系统;
使用System.Linq;
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
使用System.ComponentModel.DataAnnotations.Schema;
使用System.Data.Entity;
使用系统数据;
使用系统诊断;
使用System.Threading.Tasks;
命名空间Ef6Test
{
公车
{
公共int Id{get;set;}
公共字符串CarTypeName{get;set;}
[外键(“CarTypeName”)]
公共CarType CarType{get;set;}
}
公共级本田:汽车
{
}
公共级丰田:汽车
{
}
公共类类型
{
[关键]
公共字符串名称{get;set;}
公共整数价格{get;set;}
}
类Db:DbContext
{
公共数据库集车辆{get;set;}
公共数据库集价格{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Map(c=>c.Requires(“CarTypeName”).HasValue(“Honda”);
modelBuilder.Entity().Map(c=>c.Requires(“CarTypeName”).HasValue(“Toyota”);
基于模型创建(modelBuilder);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
SetInitializer(新的DropCreateDatabaseAlways());
使用(var db=new db())
{
db.Database.Log=m=>Console.WriteLine(m);
db.Database.Initialize(true);
}
Console.WriteLine(“按任意键退出”);
Console.ReadKey();
}
}
}
这里没什么特别的。只需将鉴别器添加为实体属性,就可以将其用于外键属性
乙二醇
使用系统;
使用System.Linq;
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
使用System.ComponentModel.DataAnnotations.Schema;
使用System.Data.Entity;
使用系统数据;
使用系统诊断;
使用System.Threading.Tasks;
命名空间Ef6Test
{
公车
{
公共int Id{get;set;}
公共字符串CarTypeName{get;set;}
[外键(“CarTypeName”)]
公共CarType CarType{get;set;}
}
公共级本田:汽车
{
}
公共级丰田:汽车
{
}
公共类类型
{
[关键]
公共字符串名称{get;set;}
公共整数价格{get;set;}
}
类Db:DbContext
{
公共数据库集车辆{get;set;}
公共数据库集价格{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Map(c=>c.Requires(“CarTypeName”).HasValue(“Honda”);
modelBuilder.Entity().Map(c=>c.Requires(“CarTypeName”).HasValue(“Toyota”);
基于模型创建(modelBuilder);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
SetInitializer(新的DropCreateDatabaseAlways());
使用(var db=new db())
{
db.Database.Log=m=>Console.WriteLine(m);
db.Database.Initialize(true);
}
Console.WriteLine(“按任意键退出”);
Console.ReadKey();
}
}
}
不,我不能在汽车级别引入CarType。它已经有了一个型号——本田、丰田等,它存储在鉴别器列中。我不明白为什么不能。你能澄清一下你的模型和限制吗?有两个原因:1)我有100万条记录,我不想通过向表中添加一个新列来“升级”;2) 这应该是不必要的,因为Discriminator
列已经包含了我需要的信息;3) 我不喜欢需要部分,我必须将每个“自定义”鉴别器映射到实体。这应该没有必要。我仍然不明白为什么不能将现有的鉴别器列映射为ForeignKey。不,我不能在Car级别引入CarType。它已经有了一个型号——本田、丰田等,它存储在鉴别器列中。我不明白为什么不能。你能澄清一下你的模型和限制吗?有两个原因:1)我有100万条记录,我不想通过向表中添加一个新列来“升级”;2) 这应该是不必要的,因为Discriminator
列已经包含了我需要的信息;3) 我不喜欢需要部分,我必须将每个“自定义”鉴别器映射到实体。这应该没有必要