![](/img/trans.png)
[英]Entity Framework - mapping one class to two tables with many to one relation
[英]Entity Framework mapping one class across two tables with a condition
我正在尝试将一个类映射到两个数据库表。 我有一个映射到Person表和Address表的Person类。 我的问题是我只想选择“地址”表的“主地址行” (IsPrimary = 1)
,却找不到或弄清楚该怎么做。
我正在使用Entity Framework v6 CodeFirst,并尝试创建EntityTypeConfiguration<T>
类
域类是...
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
// Primary Address
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string AddressLine3 { get; set; }
public string AddressPostCode { get; set; }
}
数据库表看起来像这样...
Table: Person
Int PersonId (PK)
Varchar(20) FirstName Not Null
Varchar(20) LastName Not Null
Table: Address
Int AddressId (PK)
Int PersonId (FK)
Varchar(25) AddressLine1 Null
Varchar(25) AddressLine2 Null
Varchar(25) AddressLine3 Null
Varchar(10) PostCode Not Null
Bit IsPrimary Not Null
基本上一个人可以有多个地址,但只有一个主要地址。
如果使用的是实体框架,则可能具有以下具有一对多关系的类:
public class PersonEntity
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<AddressEntity> Addresses { get; set; }
}
public class AddressEntity
{
public int AddressId { get; set; }
public int PersonId { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string AddressLine3 { get; set; }
public string AddressPostCode { get; set; }
public bool IsPrimary{ get; set; }
}
正如您在问题中提到的那样,这是人员视图模型:
public class PersonViewModel
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
// Primary Address
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string AddressLine3 { get; set; }
public string AddressPostCode { get; set; }
}
最后,您可以使用以下linq代码:
var result = ctx.PersonEntity
.Where(c => c.Addresses.FirstOrDefault(X = > X.IsPrimary == true)).ToList();
var personViewModels = result
.Select(c => new PersonViewModel{
PersonId = c.PersonId ,
FirstName = c.FirstName ,
LastName = c.LastName,
AddressLine1 = c.Addresses != null ? c.Addresses.FirstOrDefault().AddressLine1 : String.Empty ,
AddressLine2 = c.Addresses != null ? c.Addresses.FirstOrDefault().AddressLine2 : String.Empty ,
AddressLine3 = c.Addresses != null ? c.Addresses.FirstOrDefault().AddressLine3 : String.Empty });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.