【发布时间】: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 中定义这种关系?有什么限制?可以有多个
UserAddress或UserDetails与相同的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