繁体   English   中英

实体框架在一个条件下跨两个表映射一个类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM