首页 > 解决方案 > 实体框架核心 - 一对多但父级也具有单个子级的导航属性?

问题描述

我目前在实体“对话”和“消息”之间有一个有效的一对多关系,其中一个对话可以有多个消息。

这工作正常:

public class Conversation
{
    public long ID { get; set; }
}

public class Message : IEntity
{
    public virtual Conversation Conversation { get; set; }
    public long ConversationID { get; set; }
    public long ID { get; set; }
}

但是,我正在尝试将导航属性添加到名为“LastMessage”的“对话”类中,它将跟踪创建的最后一条消息记录:

public class Conversation
{
    public long ID { get; set; }
    public virtual Message LastMessage { get; set; }
    public long LastMessageID { get; set; }
}

当我尝试应用上述内容时,出现错误

System.InvalidOperationException:无法确定“Conversation.LastMessage”和“Message.Conversation”之间的一对一关系的子/依赖方。

如何在“对话”和“消息”之间保持一对多的关系,但还要在“对话”类中添加导航属性以导航到单个“消息”记录?

标签: asp.net-coreentity-framework-coreforeign-keys

解决方案


如果对话可以有多个消息,则称为一对多关系。您必须修复表格:


public class Conversation
{
    [Key]
    public long ID { get; set; }
    [InverseProperty(nameof(Message.Conversation))]
    public virtual ICollection<Message> Messages { get; set; }
    
}

public class Message 
{
    [Key]
    public long ID { get; set; }

    public long ConversationID { get; set; }
 
    [ForeignKey(nameof(ConversionId))]
    [InverseProperty("Messages")]
    public virtual Conversation Conversation { get; set; }
      
 }

推荐阅读