我在我的项目中使用Entity Framework作为ORM。让我们假设我使用Code-First模式,我有两个模型。如
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
类的每个实例在其成员First
中都有类ForeignKeyEntity
的实例。显然,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.
我不能插入重复的行,但我不想插入重复项,我想只在它不存在的情况下插入行。如何解决这个问题呢?如果不存在,如何插入外键对象?
答案 0 :(得分:1)
正常的做事方式是首先使用项目进行读取以查看是否存在。如果是,那么您需要使用ctx.Seconds.Update(item);
如果您的项目已经在上下文中,那么您可以检查状态。它将是State.Modified
或State.Added
。
GetData()中的内容