实体框架和副本
本文关键字:副本 框架 实体 | 更新日期: 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.Modified
或State.Added
。
GetData()