Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在鉴别器列上,将链接表添加到实体框架生成的表中_C#_Entity Framework - Fatal编程技术网

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) 我不喜欢
需要
部分,我必须将每个“自定义”鉴别器映射到实体。这应该没有必要