简体   繁体   English

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

[英]Entity Framework mapping one class across two tables with a condition

I'm trying to map one class to two database tables. 我正在尝试将一个类映射到两个数据库表。 I have a Person Class that maps to a Person table and an Address table. 我有一个映射到Person表和Address表的Person类。 My problem is I only want to select the Primary Address Line (IsPrimary = 1) of the Address table and I can't find or figure out how to do this. 我的问题是我只想选择“地址”表的“主地址行” (IsPrimary = 1) ,却找不到或弄清楚该怎么做。

I'm using Entity Framework v6 CodeFirst and I trying to create the EntityTypeConfiguration<T> class 我正在使用Entity Framework v6 CodeFirst,并尝试创建EntityTypeConfiguration<T>

The domain class is... 域类是...

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

and the database tables look like this... 数据库表看起来像这样...

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

Basically one Person can have multiple addresses but only One Primary Address. 基本上一个人可以有多个地址,但只有一个主要地址。

If you are using Entity Framework, probably you have these following classes with a one to many relation: 如果使用的是实体框架,则可能具有以下具有一对多关系的类:

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

And as you mentioned in you'r question, this is the person viewmodel: 正如您在问题中提到的那样,这是人员视图模型:

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

Finally you can use the following linq code: 最后,您可以使用以下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