实体框架将一个类映射到带有条件的两个表

本文关键字:有条件 两个 框架 一个 实体 映射 | 更新日期: 2023-09-27 18:13:50

我试图将一个类映射到两个数据库表。我有一个Person类,它映射到Person表和Address表。我的问题是我只想选择地址表的主地址行(IsPrimary = 1),我找不到或弄不清楚如何做到这一点。

我正在使用实体框架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; }
}

正如你在问题中提到的,这是person视图模型

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