2017-07-07 102 views
0

表有类似但不相关的数据记录实体框架6类映射到表中的列基于值

+------------+------------+-----------+-------------+----------------------+ 
| RecordType | Name | Surname | DateOfBirth | DateOfIncorporation | 
+------------+------------+-----------+-------------+----------------------+ 
| Person  | Luke  | SkyWalker | 1/1/1017 |      | 
| Company | Jedi Order |   |    | 1/1/101    | 
+------------+------------+-----------+-------------+----------------------+ 

我想用两个类来处理这个问题,而不必总是看RecordType(个人或公司)。

这是一个现有的表并没有在分裂表二的选项(讽刺的是,该表是使用代码第一实体框架创建的,但是该表现在不能被修改)

是否有一个我可以在实体框架中做到这一点?

也就是说,当我使用Person class (context.Persons)我只能取得记录类型的“人”,当我使用Company class (context.Companies)我只能取得记录类型“业公司”记录的记录 -

class Person 
{ 
string RecordType {get;set;} //This will only have "Person" 
string Name {get;set;} 
string Surname {get;set;} 
DateTime DateOfBirth {get;set;} 
} 

class Company 
{ 
string RecordType {get;set;} //This will only have Company 
string Name {get;set;} 
DateTime DateOfIncorporation {get;set;} 
} 

回答

0

是的,这是与实体绝对有可能框架。我找到的最佳指南是at this link

编辑

您目前正在使用的table-per-层次,但如果你遵循指南,那么你可以以这样的方式能够在任何个人或公司与高效地查询做强类型。例如,使用这种方法的

var allRecords = myDbContext.RecordsTable; 
var personRecords = allRecords.OfType<Person>(); 
var companyRecords = allRecords.OfType<Company>(); 

一个很好的振作是调用OfType()不会强制执行,这样你就可以在一个IQueryable<T>使用它没有太早获取记录。如果你的课程共享全部或几乎所有相同的属性,这通常是一个很好的策略。否则,您将需要使用其他继承策略之一。

+0

这非常有帮助 - 谢谢! – Looking4Answers

+0

这种方法确实需要修改表,因为我明白OfType会创建一个鉴别器(有没有一种方法可以通过Fluent API配置鉴别器?)。但最大的帮助是我不必拆分表格。 – Looking4Answers

+0

我在上面提供的链接中搜索并找到了关于更改鉴别符的一些信息([link](https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first- ctp5-part-1-table-per-hierarchy-tph)) - 会试试这个。再次感谢你 !! – Looking4Answers