我正在使用的遗留数据库使用了类似的模式
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
我该如何处理?
在我看来,你最好有一个表格文档,并有表格指定与哪个文档相关(PersonDocumet,CompanyDocumet,ItemDocument),这样你就可以有一个控制权。
当你插入数据时,第一步:插入文档然后插入到相关的其他表
资料: 身份证,网址
个人资料:
文件编号, 人号
公司文件:
文件编号, 公司编号
物品文件:
文件编号, 物品ID
在遗留系统上工作时,您需要确保现有功能保持不变。 最好为每种类型的文档使用单独的表格,尽管这可能难以管理现有数据。 处理这种情况的另一种方法是插入/更新与(PersonDocument、CompanyDocument 和 ItemDocument)相关的单独方法,您需要通过应用业务逻辑来调用这些方法。