.net EF核心不允许附加具有相同数据类型和相同键值的两个属性

des4xlb0  于 2023-01-03  发布在  .NET
关注(0)|答案(1)|浏览(127)

我知道这样的问题已经有人问过了,但是我的情况有点不同,我正在尝试向数据库中插入一个新的item实体。

public class Item : MasterData
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ItemId { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public User CreatedUser { get; set; }
    public User ModifiedUser { get; set; }
}

用户POCO

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }  
    public string FirstName { get; set; }
    public string LastName { get; set; }        
}

第一次插入时,CreatedUserModifiedUser是相同的。表示主键值相同(本例中为UserId
由于用户已经存在于数据库中,我不希望EF再次尝试插入它,所以我这样做了。

DbContext.Users.Attach(itemSet.CreatedBy);
DbContext.Users.Attach(itemSet.ModifiedBy);
await _UCMSContext.AddAsync(itemSet);
await _UCMSContext.SaveChangesAsync();

但我收到以下错误
无法跟踪实体类型“UserSet”的示例,因为已在跟踪另一个具有与{“UserId”}相同键值的示例。附加现有实体时,请确保仅附加一个具有给定键值的实体示例
如何摆脱这种情况,并保存CreatedUserModifiedUser具有相同值的item

qni6mghb

qni6mghb1#

同一实体(用户)在上下文中附加了两次。要避免这种情况,请仅在创建者用户不同时附加修改者用户:

DbContext.Users.Attach(itemSet.CreatedBy);
if(itemSet.CreatedBy != itemSet.ModifiedBy)
    DbContext.Users.Attach(itemSet.ModifiedBy);

相关问题