你能在實體框架中以一對多的關係保存父實體嗎?


我在兩個實體之間有一個簡單的,一對多的關係。

public class Contact
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    // the children
    public List<Message> Messages { get; set; }
}

public class Message
{
    public string Id { get; set; }
    public string ContactId { get; set; }
    public string Source { get; set; }
    // the parent
    public Contact Contact { get; set; }
}

這是遷移的樣子

public class Contact
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    // the children
    public List<Message> Messages { get; set; }
}

public class Message
{
    public string Id { get; set; }
    public string ContactId { get; set; }
    public string Source { get; set; }
    // the parent
    public Contact Contact { get; set; }
}

現在,我可以創建新的Contact ,添加一個新的MessageMessages財產,沒有麻煩保存。如果我加載該聯繫人,我會收到與之關聯的所有消息,沒問題。

我想知道的是如何反過來做到這一點。我想創建一個新消息(在db中不存在),將Contact屬性設置為新的聯繫對象並保存。我最終得到了一個外鍵約束(這是有道理的。在保存聯繫之前無法保存消息)。但我認為實體框架足夠聰明,可以找出關係並知道在消息之前插入聯繫人。我配置錯了嗎?

更新

這是我試圖通過的單元測試

public class Contact
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    // the children
    public List<Message> Messages { get; set; }
}

public class Message
{
    public string Id { get; set; }
    public string ContactId { get; set; }
    public string Source { get; set; }
    // the parent
    public Contact Contact { get; set; }
}

這就是service.Saveservice.Save做的事情

public class Contact
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    // the children
    public List<Message> Messages { get; set; }
}

public class Message
{
    public string Id { get; set; }
    public string ContactId { get; set; }
    public string Source { get; set; }
    // the parent
    public Contact Contact { get; set; }
}

一般承認的答案

在beta8及更高版本中, DbSet.Add()添加實體及其子項 。因為ContactMessage的父級,所以您需要先顯式添加它。

    service.Save(message.Contact);
    service.Save(message);

有關更多詳細信息,請參閱https://github.com/aspnet/EntityFramework/pull/2979


熱門答案

取決於您使用的EF7版本。適用於beta7及更早版本;

與以前版本的EF不同,當前使用EF7在對像上調用Add()不會將任何相關對象標記為已添加。

看起來這在beta8中得到了解決。更多信息在這裡





許可下: CC-BY-SA
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因