实体框架和副本

本文关键字:副本 框架 实体 | 更新日期: 2023-09-27 18:07:55

我在我的项目中使用实体框架作为ORM。假设我使用代码优先模式,并且有两个模型。例如

internal class First
{        
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int  Id { get; set; }
    public string Name { get; set; }
}
internal class Second
{        
    public int  Id { get; set; }
    public First ForeignKeyEntity { get; set; }
    // other members
}
下面是填充数据库的代码:
List<Second> res = GetData();
using (var ctx = new StatisticContext())
{
    foreach (var item in res)
    {
        ctx.Seconds.Add(item);
    }
    ctx.SaveChanges();
}

可以看到,类Second的每个实例在其成员ForeignKeyEntity中都有类First的实例。显然,First的一些实例可以在res中复制。当我运行此代码时,我在ctx.SaveChanges()中获得DbUpdateException,内部异常具有以下消息:

Violation of PRIMARY KEY constraint 'PK_dbo.First'. 
Cannot insert duplicate key in object 'dbo.First'. 
The duplicate key value is (29459). The statement has been terminated.

我可以不插入重复的行,但我不想插入重复的,我想插入行只有当它不存在。如何解决这个问题?如何插入外键对象,如果不存在?

实体框架和副本

通常的做法是先对item执行读取操作,看看它是否存在。如果是,那么你需要使用ctx.Seconds.Update(item);

如果您的项目已经在上下文中,那么您可以检查状态。它将是State.ModifiedState.Added

GetData()