对象不添加儿童 - EF代码优先

问题描述:

自从我上次使用EF以来已经有相当长的一段时间了。我以前从未遇到任何问题。现在我试图插入一个与另一个对象有一对多关系的对象。但在API调用中,子对象的集合数组显示为空,但可以在子对象的api调用中看到父对象。对象不添加儿童 - EF代码优先

我有我的模型如下:

会话表

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

ChatMessage表

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

} 

我流利的API看起来是这样的:

  modelBuilder.Entity<ChatMessage>() 
       .HasRequired(x => x.Conversation) 
       .WithMany(x => x.ChatMessages) 
       .HasForeignKey(x => x.ConversationID); 

我正在尝试创建一个对话实体并向它的集合中添加一个聊天对象。我这样做,像这样:

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

结果,ChatMessage API调用显示了它的相关的谈话,但谈话的对象不在收藏中显示聊天。我在这里做错了什么?

+0

保存数据还是检索问题?您分享的代码是为了保存。 – sachin

添加代码工作正常(其他情况下您将无法看到新的聊天消息)。问题出在你的数据检索代码上。

由于您的ChatMessage.Conversation属性标记为virtual,最有可能它得到lazy loaded,这就是为什么你看到它填充。

与此同时,你Conversation.ChatMessagesvirtual,因此你需要使用它的方法Inlclude,或根据您的要求明确eager load,将其标记virtual得到像逆导航属性延迟加载行为。

+1

是的,我认为之前,我读了这个。感谢您提供您的见解:) –