实体框架核心-在两个表之间实现而不使用主键

时间:2019-01-07 11:58:46

标签: c# .net postgresql .net-core entity-framework-core

我想用EFCore.Postgres 2.1.2在dotnet core 2.1中编写控制台应用程序。

我在现有数据库中有两个表。每个表都有它自己的主键,但是这些表应该通过另一个字段-UserId

进行关联。

db

我的模特:

public class UserAddress
{
    public int UserAddressId {get;set;}
    public int UserId {get;set;}
    public string City {get;set;}
    public string Street {get; set;}

    public virtual UserDetails UserDetails {get;set;}
}

public class UserDetails
{
    public int UserDetailId {get;set;}
    public int UserId {get;set;}

    public string Name {get;set;}
    public string Surname {get;set;}
}

如何通过UserId“教”实体框架加入这些表? 我想像下面那样使用它们

using (var MyDb = new GraffitiDbContext())
{
    var query = MyDb.UserAddress              
        .Include(row => row.UserDetails);

    foreach (var item in query)
    {
        Console.Writeline(item.UserDetails.Name);
    }
}

1 个答案:

答案 0 :(得分:0)

使用当前配置,您无法推断此联接,因为必须从UserAddressUser再到UserDetails。您可以在UserAddressUserDetails之间添加关系以使遍历成为可能,或者可以使用以下上下文导航:

context.UserAddress.Include(x => x.User).ThenInclude(x => x.UserDetails)

问题是User可以有许多UserDetails,因此当您在User查询中包含UserAddress时,很可能会得到很多记录

Address1 -> User1 -> UserDetail1
Address1 -> User1 -> UserDetail2