2015-08-19 71 views
1

我遇到了一個錯誤,試圖在我的MVC應用程序中保存一些數據。我們首先使用代碼。EF 6表映射錯誤

我救了我的數據是這樣的:

var fieldDefinition = db.CustomFields 
    .FirstOrDefault(x => x.CustomFieldId == thisResp.CustomFieldId); 
var newData = new CustomData 
{ 
    ProjectId = new Guid("280288D7-7630-E511-8420-00215E466552"), 
    CustomFieldId = thisResp.CustomFieldId 
}; 
if (fieldDefinition.AllowMultiple) 
{ 
    var values = thisResp.Value.Split(','); 
    foreach (var thisValue in values) 
    { 
     var newMulti = new CustomDataMulti 
     { 
      CustomDataId = newData.CustomDataId, 
      CustomValue = thisValue 
     }; 
     db.CustomDataMulti.Add(newMulti); 
    } 
} 

db.CustomData.Add(newData); 
db.SaveChanges(); 

不過,我得到這個消息:

無法確定 'PublicationSystem.Model.CustomData_CustomDataMultis' 關係的主要終點。多個添加的實體可能具有相同的主鍵。

我的類的設置是這樣的:

public partial class CustomData : BaseEntity 
{ 

    [Key] 
    public int CustomDataId { get; set; } 
    public Guid ProjectId { get; set; } 
    public Guid CustomFieldId { get; set; } 
    //... 
    public virtual ICollection<CustomDataText> CustomDataTexts { get; set; } 
    public virtual ICollection<CustomDataMulti> CustomDataMultis { get; set; } 
} 

CustomDataMapping.cs

public CustomDataMapping() 
{ 
    //Primary key 
    HasKey(t => t.CustomDataId); 
    //Constraints 
    Property(e => e.CustomValue).IsUnicode(false); 
    HasMany(e => e.CustomDataTexts) 
     .WithRequired(e => e.CustomData) 
     .WillCascadeOnDelete(false); 

    HasMany(e => e.CustomDataMultis) 
     .WithRequired(e => e.CustomData) 
     .WillCascadeOnDelete(false); 

    ToTable("CustomData"); 
} 

CustomDataMulti.cs

[Table("CustomDataMulti")] 
public partial class CustomDataMulti : BaseEntity 
{ 
    [Key] 
    public int CustomDataMultiId { get; set; } 

    public int CustomDataId { get; set; } 

    [Required] 
    [StringLength(150)] 
    public string CustomValue { get; set; } 

    public virtual CustomData CustomData { get; set; } 
} 

CustomDataMultiMapping.cs

public CustomDataMultiMapping() 
{ 
    //Primary key 
    HasKey(t => t.CustomDataMultiId); 

    //Constraints 
    Property(e => e.CustomValue).IsUnicode(false); 

    ToTable("CustomDataMulti"); 
} 

我不知道我在做什麼錯。

回答

1

的EntityFramework犯規理解下面的實體之間的關係的主要端: -

和的CustomData CustomDataMulti。

這是因爲兩個實體之間的關係必須具有恆定關係的一方。

在這種情況下,A的CustomData 實體可以有多個CustomDataMulti對象。 (列表)。

但是可以一個CustomDataMulti曾經存在沒有屬於一個CustomData對象?

您需要做的是更改CustomDataMulti類,以便CustomData的虛擬屬性爲必需。

見下圖: -

[Table("CustomDataMulti")] 
public partial class CustomDataMulti : BaseEntity 
{ 
    [Key] 
    public int CustomDataMultiId { get; set; } 

    public int CustomDataId { get; set; } 

    [Required] 
    [StringLength(150)] 
    public string CustomValue { get; set; } 

    [Required] 
    public virtual CustomData CustomData { get; set; } 
} 

這是的EntityFramework用來確定關係公約。

舉一個更清晰的例子。

思考的OrderItem的,一個OrderItem的將永遠屬於一個訂單

OrderItem沒有相關的命令是沒用的。

The Order entity is prinicpal end of the relationship。

希望這會有所幫助。

+0

我應該設置CustomDataId = newData.CustomDataId或CustomData = newData? –

+0

你可以同時設置,但CustomDataId = newData.CustomDataId就足夠了 – Derek

+0

我很感謝你的解釋。這很有幫助。我最終做了CustomData = newData,因爲現在需要CustomData,否則我會得到一個錯誤。 –