2017-08-23 190 views
1

我想用代碼第一個實體框架來設置一個父實體的子實體的兩個實例,每個實例都有一對一的關係。實體框架多對一

我嘗試使用以下型號: -

public class Parent 
{ 
    [Key] 
    public int Id { get; set; } 

    public virtual Child FirstChild { get; set; } 

    public virtual Child SecondChild { get; set; } 
} 

public class Child 
{ 
    [Key, ForeignKey("Parent")] 
    public int ParentId{ get; set; } 

    public Parent Parent { get; set; } 
} 

然而,當我嘗試將孩子添加到父,我得到以下異常: -

context.Add(new Parent 
{ 
    FirstChild = new Child(), 
    SecondChild = new Child() 
}); 
context.SaveChanges(); 

System.Data。 Entity.Infrastructure.DbUpdateException:檢測到衝突 更改。嘗試使用相同的密鑰插入多個 實體時可能會發生這種情況。

我認爲這意味着代碼試圖將FirstChild和SecondChild都設置爲使用與父Id相同的Id,因爲它們不能同時具有相同的主鍵。有沒有辦法將模型配置爲允許兩個One to One鏈接?

回答

0

你的願望是不是一對一的映射。如果你認爲這是一個兩個映射。 爲了在EF中使用此功能,您需要映射爲一對多關係並將外部使用情況的集合屬性隱藏起來。

public class Parent 
{ 
    [Key] 
    public int Id { get; set; } 

    protected virtual List<Child> Children {get; set;} 

    [NotMapped] 
    public Child FirstChild 
    { 
     get{ return Children[0]; } 
     set{ Children[0] = value; } 
    } 

    [NotMapped] 
    public Child SecondChild 
    { 
     get{ return Children[1]; } 
     set{ Children[1] = value; } 
    } 
} 

public class Child 
{ 
    [Key, ForeignKey("Application")] 
    public int ApplicationId { get; set; } 

    [Key, ForeignKey("Parent")] 
    public int ParentId { get; set; } 
    [Key] 
    public int Id { get; set; } 

    public Parent Parent { get; set; } 
} 

您可能需要使用這個模型構建器配置,因爲屬性是不是這個強大到足以映射。

+0

我試過你的建議代碼,但是當我嘗試調用SaveChanges()時,我得到一個異常:無法確定依賴操作的有效順序。由於外鍵約束,模型要求或商店生成的值,可能會存在依存關係。 – Joe

+0

您是否使用modelBuilder對象來配置映射? – Miguel

+0

另外,我忘記爲各個屬性添加忽略屬性。你可以再試一次嗎? – Miguel