0

我在实体框架中使用实体框架作为我的项目中的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(); 
} 

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

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

'First:Second'是什么关系? – Sampath

+0

@Sampath Second的每个实例都有First的实例。至于数据库,我有两个表:第一个和第二个。第二个表中有Id的外键第一个 – Pupkin

+0

是否意味着'1:1'? – Sampath

回答

1

做事情的正常方式是先用item来读取它是否存在。如果是,那么你需要使用ctx.Seconds.Update(item);

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

WhatData in GetData()