Entity Framework 7 和条件外键

问题描述 投票:0回答:2

我正在使用的遗留数据库使用了类似的模式

CREATE TABLE [Document](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [EntityTypeID] [int] NOT NULL,  -- Tells us if the document is for a item, person, company....
    [EntityID] [bigint] NOT NULL,   -- Is the primary key value from the item, person, company table
    [Url] [nvarchar](1024) NULL,
)

文档表中没有定义 FK,因为每条记录都可能描述与不同父表相关的数据。

例子:

文件台

ID 实体类型ID 实体ID 网址
1 1 123 ...
2 1 123 ...
3 2 123 ...
4 2 123 ...
5 3 567 ...
6 3 456 ...

人桌

ID 姓名
123 戴夫

物品表

ID 姓名
123 耳机

公司表

ID 姓名
567 极致
456 Globlex

假设 EntityTypeID 定义为 Person = 1、Item = 2 和 Company = 3。那么

Document.ID 1 and 2 are Dave's documents
Document.ID 3 and 4 are documents about Headphones  
Document.ID 5 are documents for Acme
Document.ID 6 are documents for Globlex

我的第一个想法是为 PersonDocument、ItemDocument 和 CompanyDocument 创建视图 在 OnModelCreating 中做类似的事情

modelBuilder.Entity<PersonDocument>(entity => 
{
  ...
  entity.HasOne(d => d.Person).WithMany(p => p.PersonDocument).HasForeignKey(d => d.EntityId);
  ...
 }

这适用于读取数据和填充我的 DTO 类,但我不知道我是否可以使用该方法更新或创建新的文档记录。

当我尝试添加文档时,我得到了

The entity type 'PersonDocument' is not mapped to a table, therefore the entities cannot be persisted to the database. Call ToTable

我该如何处理?

c# entity-framework foreign-keys
2个回答
1
投票

在我看来,你最好有一个表格文档,并有表格指定与哪个文档相关(PersonDocumet,CompanyDocumet,ItemDocument),这样你就可以有一个控制权。

当你插入数据时,第一步:插入文档然后插入到相关的其他表

资料: 身份证,网址

个人资料:

文件编号, 人号


公司文件:

文件编号, 公司编号


物品文件:

文件编号, 物品ID


0
投票

在遗留系统上工作时,您需要确保现有功能保持不变。 最好为每种类型的文档使用单独的表格,尽管这可能难以管理现有数据。 处理这种情况的另一种方法是插入/更新与(PersonDocument、CompanyDocument 和 ItemDocument)相关的单独方法,您需要通过应用业务逻辑来调用这些方法。

© www.soinside.com 2019 - 2024. All rights reserved.