EF 6表映射错误

时间:2015-08-19 14:46:13

标签: c# asp.net-mvc entity-framework

我在尝试在我的MVC应用中保存一些数据时遇到错误。我们首先使用代码。

我正在保存我的数据:

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 个答案:

答案 0 :(得分:1)

EntityFramework不理解以下实体之间关系的主要结束: -

CustomData和CustomDataMulti。

这是因为两个实体之间的关系必须使关系的一侧保持不变。

在这种情况下, 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 是没用的。

订单实体是该关系的 prinicpal 结尾。

希望这有帮助。