对象不添加子项 - EF Code First

时间:2016-09-15 18:06:10

标签: c# entity-framework asp.net-web-api

自从我上次使用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; }
}

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

}

My Fluent 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调用会显示与之关联的对话,但Conversation对象不会在其集合中显示聊天。我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

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

由于您的ChatMessage.Conversation媒体资源已标记为virtual,因此很可能会获得lazy loaded,这就是您看到它填充的原因。

同时,您的Conversation.ChatMessages不是virtual,因此您需要使用Inlclude方法明确eager load,或根据您的要求,标记它virtual获取延迟加载行为,如反向导航属性。