【问题标题】:EF Core 3.0.0 - Two one-to-one relations of same typeEF Core 3.0.0 - 两个相同类型的一对一关系
【发布时间】:2021-07-15 14:42:42
【问题描述】:

我正在尝试创建两个从一种类型到另一种类型的一对一关系。

背景: 我有一个发送请求的客户端。在一个新的用户故事中,我需要向客户端添加提醒请求。

问题: 在我添加或更新请求后,它们会覆盖其中一个请求的外键属性(通常,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();
        }
    }
}

数据库结果:

那么有没有人知道为什么它会这样以及如何让它正常工作?

【问题讨论】:

  • 尝试直接设置RequestId和ReminderId。
  • 只是一个错字:request.ReminderClient = client; 应该是reminder.ReminderClient = client;

标签: c# .net-core entity-framework-core ef-code-first ef-core-3.0


【解决方案1】:

这看起来像一个错误,它在 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

【讨论】:

    【解决方案2】:

    尝试添加这些属性:

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

    【讨论】:

    • 我不知道为什么,但这按预期工作......谢谢家伙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2019-07-25
    • 2021-07-21
    • 2019-02-07
    • 2017-10-26
    • 2017-06-10
    相关资源
    最近更新 更多