2015-08-19 70 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,否则我会得到一个错误。 –