【问题标题】:Entity Framework Core - realtion between two tables without using primary keyEntity Framework Core - 两个表之间的关系而不使用主键
【发布时间】:2019-06-02 02:18:40
【问题描述】:

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

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

我的模型:

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

【问题讨论】:

  • 你会如何在 postgres 中定义这种关系?有什么限制?可以有多个UserAddressUserDetails 与相同的UserId 吗? UserDetails 可以没有UserAddress 和特定的UserId,反之亦然?
  • 如果UserId 在其中一个表中不是唯一的,则通常是不可能的。你也没有User 表,其中UserId 是一个PK,所以这两个表通过它间接相关?
  • postgres中有一张表,以UserId为PK,而这两张表有FK。但在我的控制台应用程序中,我不需要该表中的数据。如果您介意 UserAddres 和 UserDetails 之间的严格关系 - 不存在这样的关系。这是一对一的关系。假设我不需要 UserDetails,如果没有指定 UserId 的 UserAddress。在这两个表中,UserId 都是唯一的。
  • 您可以尝试将两个实体中的UserId 映射为alternate key,并尝试将一对一的关系映射到modelBuilder.Entity<UserAddress>().HasOne(e => e.UserDetails).WithOne().HasPrincipalKey<UserAddress>(e => e.UserId).HasForeignKey<UserDetails>(e => e.UserId)。它最终可能会起作用,但我个人会保留 User 实体(即使只有 PK 属性)和真正的关系。
  • 谢谢 Ivan Stoev,这就是我一直在寻找的答案 - 是否可能,但这不是最好的方法。我想学习 EF,所以我不使用其他 ORM 或 ADO.NET。

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2011-11-03
    • 2022-12-10
    • 1970-01-01
    相关资源
    最近更新 更多