实体框架中的主键值

时间:2020-01-13 17:02:58

标签: c# entity-framework

实体布局包含场所(VenueId道具)的整数值,其自身的id和其他信息。

CONSTRAINT [FK_Venue_Layout] FOREIGN KEY ([VenueId]) REFERENCES [dbo].[Venue] ([Id])

当我尝试使用相同的VenueId添加两个布局时,出现此错误

已成功提交对数据库的更改,但是更新对象上下文时发生错误。 ObjectContext可能处于不一致状态。内部异常消息:由于多个“ DataAccess.Models.LayoutModel”类型的实体具有相同的主键值,因此保存或接受更改失败。确保显式设置的主键值是唯一的。确保在数据库和实体框架模型中正确配置了数据库生成的主键。将实体设计器用于数据库优先/模型优先配置。使用“ HasDatabaseGeneratedOption”流利的API或“ DatabaseGeneratedAttribute”进行代码优先配置。”

我的实体代码:

[Table("Layout")]
public class LayoutModel
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public int Id { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int VenueId { get; set; }

    public string Description { get; set; }
}

插入代码:

var layouts = new List<LayoutModel>
            {
                new LayoutModel { VenueId = 1, Description = "First layout" },
                new LayoutModel { VenueId = 1, Description = "Second layout" },
            };
            _context.Layouts.AddRange(layouts);
            _context.SaveChanges();

不允许使用导航属性

1 个答案:

答案 0 :(得分:1)

Id列或属性在LayoutViewModel的定义中被标记为标识列

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int Id { get; set; }

因此,无需显式分配它,因为在将行插入到Layout表中之后,它将由数据库自动填充。请如下更新您的布局人口以删除ID分配:

var layouts = new List<LayoutModel> { 
    new LayoutModel { /*Id = 1,*/ VenueId = 1, Description = "First layout" }, 
    new LayoutModel { /*Id = 2, */ VenueId = 1, Description = "Second layout" }
};
// code smell
foreach(var layout in layouts)
{
     context.Entry(layout).State = EntityState.Added;
}
_context.Layouts.AddRange(layouts);
_context.SaveChanges();

另外,请按如下所示更新您的LayoutModel:

public class LayoutModel
{
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     [Key]
     [Column(Order = 0)]
     public int Id { get; set; }

     [Key]
     [Column(Order = 1)]
     //[ForeignKey("Venue")]
     [DatabaseGenerated(DatabaseGeneratedOption.None)]
     public int VenueId { get; set; }

     //public virtual VenueModel Venue { get; set; } //Please correct Venue property type
}

另外,请验证Venue是否已加载到_context.Layouts中。

相关问题