实体框架6根据列中的值将类映射到表

时间:2017-07-07 14:32:56

标签: c# entity-framework

表格具有类似但不相关的数据记录

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

我想使用两个类来处理这个问题,而不必总是查看RecordType(Person或Company)。

这是一个现有的表,并没有将表拆分为两个的选项(具有讽刺意味的是,这个表是使用代码第一个实体框架创建的,但现在无法修改表)

我有可能在实体框架中做到这一点吗?

也就是说,当我使用Person class (context.Persons)时,我只获取RecordType为“Person”的记录,当我使用Company class (context.Companies)时,我只获得RecordType为“Comapany”的记录 -

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;}
}

1 个答案:

答案 0 :(得分:0)

是的,实体框架肯定是可行的。我发现的最佳指南是at this link

修改

您当前正在使用Table-Per-Hierarchy,但是如果您遵循该指南,那么您可以通过这样的方式来执行此操作,以便能够有效地查询具有强类型的人员或公司。例如,

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

使用此方法的一个好处是调用OfType()不会强制执行,因此您可以在IQueryable<T>上使用它而不会过早地获取记录。如果您的类共享所有或几乎所有相同的属性,这通常是一个很好的策略。否则,您将需要使用其他继承策略之一。