Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 实体框架-如何避免类层次结构中的TPC_C#_Entity Framework_Database Design_Ef Code First - Fatal编程技术网

C# 实体框架-如何避免类层次结构中的TPC

C# 实体框架-如何避免类层次结构中的TPC,c#,entity-framework,database-design,ef-code-first,C#,Entity Framework,Database Design,Ef Code First,在我的业务领域中,我有两个实体,作为对象,它们根据它们所公开的属性定义了层次关系,但在数据库级别上它们是非常不同的 具体地说,我拥有的是一个Image类,它定义了属性A和B(在Id旁边),以及几个简单的方法。 然后我有一个缩略图类,它与图像完全相同 在OOP透视图中,使缩略图从图像继承是合乎逻辑的。但是,在Db级别,这两个实体在一个重要细节上有所不同: 图像将FK声明为另一个表,而不是缩略图 实际上,图像定义了一个产品(例如)可以拥有的图像集(多对一),但缩略图定义了同一产品可以拥有的唯一缩略图

在我的业务领域中,我有两个实体,作为对象,它们根据它们所公开的属性定义了层次关系,但在数据库级别上它们是非常不同的

具体地说,我拥有的是一个Image类,它定义了属性A和B(在Id旁边),以及几个简单的方法。 然后我有一个缩略图类,它与图像完全相同

在OOP透视图中,使缩略图从图像继承是合乎逻辑的。但是,在Db级别,这两个实体在一个重要细节上有所不同: 图像将FK声明为另一个表,而不是缩略图

实际上,图像定义了一个产品(例如)可以拥有的图像集(多对一),但缩略图定义了同一产品可以拥有的唯一缩略图(一对一或零对一)。在这种情况下,缩略图将不在图像集中

因此,在DB中,图像表应该有列A、B、Id和FK to Product,而缩略图表应该只有列A、B和Id(这也是FK to Product)

若我首先使用EF代码对此进行建模,那个么(尽我所能)它最多会为图像生成一个表,然后为缩略图生成一个表,以及图像和缩略图之间的一对一关联。我正试图避免这种关联,因为要添加缩略图,我还必须将其添加为图像,然后设置FK,这是不可能的,因为它没有

如果我明确指定生成TPC,那么它不允许我在产品和映像之间建立关联,因为关联只能在大多数派生类型中定义


您有什么想法吗?

您需要配置您的实体,以便它们使用:

在TPC映射场景中,层次结构中的所有非抽象类型都映射到各个表。映射到派生类的表与映射到数据库中基类的表没有关系。类的所有属性(包括继承的属性)都映射到相应表的列

这是使用TPC的可能配置示例:

modelBuilder.Entity<Image>() 
  .Property(c => c.ImageID) 
  .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

modelBuilder.Entity<ThumbNail>().Map(m => 
{ 
    m.MapInheritedProperties(); 
    m.ToTable("Thumbnails");
}); 
modelBuilder.Entity()
.Property(c=>c.ImageID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
modelBuilder.Entity().Map(m=>
{ 
m、 MapInheritedProperties();
m、 易变(“缩略图”);
}); 
你必须为你的特殊目的对它进行微调。例如,将FK特性排除在以下情况:

modelBuilder.Entity<Thumbnail>().Ignore(p => p.FkProperty);
modelBuilder.Entity().Ignore(p=>p.FkProperty);

您可以尝试使图像从缩略图继承。这样,您可以仅在图像中设置FK,而不在缩略图中设置FK。不知道这是否是问题的解决方案,但如果两个类完全相同,则可以“交换”关系。@Koosshh56,这不起作用。如果我只想为缩略图添加其他属性,该怎么办?缩略图将始终是图像,但它也是图像的一种更严格的情况。我想告诉EF忽略从图像继承的缩略图,不管我是否必须手动映射所有属性或其他什么,我必须做类似的事情。试着看一看