C# 对象没有';t先添加子项-EF代码

C# 对象没有';t先添加子项-EF代码,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,我已经很久没有使用EF了。我以前使用它从来没有遇到过任何问题。现在我尝试插入一个与另一个对象有一对多关系的对象。但是在API调用中,子对象的集合数组显示为空,但是在子对象的API调用中可以看到父对象 我的模型如下: 对话表 public class Conversation { public Conversation() { this.ChatMessages = new List<ChatMessage>(); this.Delet

我已经很久没有使用EF了。我以前使用它从来没有遇到过任何问题。现在我尝试插入一个与另一个对象有一对多关系的对象。但是在API调用中,子对象的集合数组显示为空,但是在子对象的API调用中可以看到父对象

我的模型如下:

对话表

 public class Conversation
{
    public Conversation()
    {
        this.ChatMessages = new List<ChatMessage>();
        this.DeletedConversations = new List<ConversationDeleted>();
    }
    public int ConversationID { get; set; }
    public string toUser { get; set; }
    public string FromUser { get; set; }

    [InverseProperty("Conversation")]
    public ICollection<ChatMessage> ChatMessages { get; set; }
    public ICollection<ConversationDeleted> DeletedConversations { get; set; }
    public DateTime CreatedAt { get; set; }
    public int UserID { get; set; }
}
public class ChatMessage
{
    public int ChatMessageID { get; set; }
    public string fromUser { get; set; }
    public string toUser { get; set; }
    public string Message { get; set; }
    public bool DeliveryStatus { get; set; }
    public DateTime CreatedAt { get; set; }
    public Guid UniqueID { get; set; }
    public int ConversationID { get; set; }

    [ForeignKey("ConversationID")]
    public virtual Conversation Conversation { get; set; }
    public ICollection<MessageDeleted> MessagesDeleted { get; set; }
    public int UserId { get; set; }

}
这就是我检索对话对象的方式:

   public IQueryable<Conversation> GetConversations()
    {
        return db.Conversations;
    }
public IQueryable GetConversations()
{
返回db.Conversations;
}

因此,ChatMessage API调用显示与其关联的对话,但对话对象不显示其集合中的对话。我做错了什么?

添加代码工作正常(否则您将无法看到新的聊天信息)。问题在于您的数据检索代码

由于您的
ChatMessage.Conversation
属性被标记为
virtual
,因此它很可能会被填充,这就是您看到它被填充的原因


同时,您的
对话.ChatMessages
不是
虚拟的
,因此您需要使用
include
方法或根据您的要求显式地访问它,将其标记为
virtual
以获得延迟加载行为,如反向导航属性。

保存数据或检索有问题吗?你共享的代码是用来保存的。是的,我在读这篇文章之前就想到了。感谢您提供您的见解:)
   public IHttpActionResult CreateConversation()
    {
        ChatMessage msg = new ChatMessage { CreatedAt = DateTime.UtcNow, DeliveryStatus = true, fromUser = "annettehiggs", toUser = "terrydriscoll", Message = "Hum tum", UniqueID = Guid.NewGuid(), UserId = 43 };
        Conversation conv = new Conversation();
        conv.ChatMessages.Add(msg);
        conv.CreatedAt = DateTime.UtcNow;
        conv.FromUser = "annettehiggs";
        conv.toUser = "terrydriscoll";

        DataModel db = new DataModel();
        db.Conversations.Add(conv);
        db.SaveChanges();

        return Ok(conv);
    }
   public IQueryable<Conversation> GetConversations()
    {
        return db.Conversations;
    }