EF表映射错误

本文关键字:错误 映射 EF | 更新日期: 2023-09-27 18:08:39

我遇到了一个错误,试图在我的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");
}

我不知道我做错了什么

EF表映射错误

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

CustomData和customdatammulti .

这是因为两个实体之间的关系必须有一方是恒定的。

在这种情况下,一个CustomData实体可以有多个 customdatammulti 对象。(列表)。

但是 customdatammulti 是否可以存在而不属于CustomData对象?

你需要做的是改变customdatammulti类,使CustomData的虚拟属性为Required。

见下:-

[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用来确定关系的约定。

给出一个更清晰的例子。

考虑OrderItemOrderItem总是属于Order

没有相关Order的OrderItem是无用的。

Order实体是关系的 principal 端。