实体框架和重复

时间:2016-09-19 14:49:49

标签: c# sql-server entity-framework ef-code-first entity-framework-6

我在我的项目中使用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.

我不能插入重复的行,但我不想插入重复项,我想只在它不存在的情况下插入行。如何解决这个问题呢?如果不存在,如何插入外键对象?

1 个答案:

答案 0 :(得分:1)

正常的做事方式是首先使用项目进行读取以查看是否存在。如果是,那么您需要使用ctx.Seconds.Update(item);

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

GetData()中的内容