EF Core 3.0.0 - 两个相同类型的一对一关系
EF Core 3.0.0 - Two one-to-one relations of same type
我正在尝试创建从一种类型到另一种类型的两个一对一关系。
背景:
我有一个发送请求的客户端。在一个新的用户故事中,我需要向客户端添加提醒请求。
问题:
在我添加或更新请求后,它们会覆盖其中一个请求的外键 属性(通常 Reminder 的 ID 将被放入 RequestId 和 ReminderId 两个字段)。
数据库模型:
public class Client
{
[Key]
public int Id { get; set; }
public int? RequestId { get; set; }
[ForeignKey(nameof(RequestId))]
public Request Request { get; set; }
public int? ReminderId { get; set; }
[ForeignKey(nameof(ReminderId))]
public Request Reminder { get; set; }
}
public class Request
{
[Key]
public int Id { get; set; }
[InverseProperty(nameof(Client.Request))]
public Client RequestClient { get; set; }
[InverseProperty(nameof(Client.Reminder))]
public Client ReminderClient { get; set; }
}
一些测试模型的代码:
class Program
{
static void Main(string[] args)
{
using (var context = new Context())
{
var client = new Client();
client = context.Clients.Add(client).Entity;
context.SaveChanges();
var request = new Request();
request.RequestClient = client;
context.Requests.Add(request);
context.SaveChanges();
var reminder = new Request();
request.ReminderClient = client;
context.Requests.Add(reminder);
context.SaveChanges();
}
using (var context = new Context())
{
var t = context.Clients.ToList();
var t2 = context.Requests.ToList();
}
}
}
数据库结果:
那么有没有人知道它为什么会这样以及如何让它正常工作?
这看起来像是一个错误,它在 EF Core 5.0.5 上重现。要解决此问题,请像这样简化您的代码:
var client = new Client();
client.Request = new Request();
client.Reminder = new Request();
context.Clients.Add(client);
context.SaveChanges();
IE 使用客户端的导航属性而不是请求的属性关联实体。
请在这里打开一个问题:https://github.com/dotnet/efcore/issues
尝试添加这些属性:
public class Client
{
.....
[ForeignKey(nameof(RequestId))]
[InverseProperty("RequestClient")]
public virtual Request Request { get; set; }
[ForeignKey(nameof(ReminderId))]
[InverseProperty("ReminderClient")]
public virtual Request Reminder { get; set; }
}
我正在尝试创建从一种类型到另一种类型的两个一对一关系。
背景: 我有一个发送请求的客户端。在一个新的用户故事中,我需要向客户端添加提醒请求。
问题: 在我添加或更新请求后,它们会覆盖其中一个请求的外键 属性(通常 Reminder 的 ID 将被放入 RequestId 和 ReminderId 两个字段)。
数据库模型:
public class Client
{
[Key]
public int Id { get; set; }
public int? RequestId { get; set; }
[ForeignKey(nameof(RequestId))]
public Request Request { get; set; }
public int? ReminderId { get; set; }
[ForeignKey(nameof(ReminderId))]
public Request Reminder { get; set; }
}
public class Request
{
[Key]
public int Id { get; set; }
[InverseProperty(nameof(Client.Request))]
public Client RequestClient { get; set; }
[InverseProperty(nameof(Client.Reminder))]
public Client ReminderClient { get; set; }
}
一些测试模型的代码:
class Program
{
static void Main(string[] args)
{
using (var context = new Context())
{
var client = new Client();
client = context.Clients.Add(client).Entity;
context.SaveChanges();
var request = new Request();
request.RequestClient = client;
context.Requests.Add(request);
context.SaveChanges();
var reminder = new Request();
request.ReminderClient = client;
context.Requests.Add(reminder);
context.SaveChanges();
}
using (var context = new Context())
{
var t = context.Clients.ToList();
var t2 = context.Requests.ToList();
}
}
}
数据库结果:
那么有没有人知道它为什么会这样以及如何让它正常工作?
这看起来像是一个错误,它在 EF Core 5.0.5 上重现。要解决此问题,请像这样简化您的代码:
var client = new Client();
client.Request = new Request();
client.Reminder = new Request();
context.Clients.Add(client);
context.SaveChanges();
IE 使用客户端的导航属性而不是请求的属性关联实体。
请在这里打开一个问题:https://github.com/dotnet/efcore/issues
尝试添加这些属性:
public class Client
{
.....
[ForeignKey(nameof(RequestId))]
[InverseProperty("RequestClient")]
public virtual Request Request { get; set; }
[ForeignKey(nameof(ReminderId))]
[InverseProperty("ReminderClient")]
public virtual Request Reminder { get; set; }
}