实体框架插入失败

时间:2014-09-24 14:23:59

标签: asp.net-mvc entity-framework entity-framework-extended

使用EF6 + EF扩展程序进行批量删除。

在代码中,我做了两件事:首先清理所有相关实体,然后添加新的相关实体。只是为了避免为相似性而作弊。

这个主要对象类:

[Table("distrule")]
public class Distrule: CommonEntity
{
    //other properties
    public virtual ICollection<Distrule_content> DistruleContent { get; set; }
}

[Table("distrule_content")]
public class Distrule_content
{
    [Key,Column(Order=0)]
    public int distrule_id { get; set; }
    [Key, Column(Order = 1)]
    public string IDEC { get; set; }

    [ForeignKey("distrule_id")]
    public virtual Distrule Distrule { get; set; }
    [ForeignKey("IDEC")]
    public virtual Content Content { get; set; }
}

这是delete-1代码:

Db.Distrule_contents.Where(x=> x.distrule_id == DistruleId).Delete();
Db.SaveChanges();

这是删除2代码:

List<Distrule_content> dcs = Distrule.DistruleContent.ToList();
dcs.Select(x => { Db.Entry(x).State = System.Data.Entity.EntityState.Deleted; return x; }).ToList();
Db.SaveChanges();

经过一些操作后添加新条目:

//dc has type of List<Distrule_content> and contain new collection.
Db.Distrule_contents.AddRange(dc);
Db.SaveChanges();

因此,当我使用dele-1使其更快(在某些情况下最多有10K条目要删除)时,我收到了这个错误:

  

System.InvalidOperationException:对数据库的更改是   已成功提交,但更新时发生错误   对象上下文。 ObjectContext可能处于不一致状态。   内部异常消息:保存或接受更改失败,因为   不止一个类型的实体&#39; IDS.DAL.Entities.Distrule_content&#39;有   相同的主键值。确保显式设置主键   价值观是独一无二确保数据库生成的主键是   在数据库和实体框架中正确配置   模型。使用Entity Designer for Database First / Model First   组态。使用&#39; HasDatabaseGeneratedOption&#34;流利的API或   &#39; DatabaseGeneratedAttribute&#39;

当我使用删除-2时,一切正常,只需更长时间。

db context的所有操作都在事务范围内工作,如下所示:

new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted, Timeout = TransactionManager.MaximumTimeout });

Db上下文如下所示:

public class DBWrapper : DbContext
{
    public DBWrapper()
        : base("Name=DefaultConnection")
    {

        var adapter = (IObjectContextAdapter)this;
        var objectContext = adapter.ObjectContext;
        objectContext.CommandTimeout = 30; // value in seconds
        // set this for faster delete/insert operations
        // reduce wait time from minute or two to 10-15 seconds
        this.Configuration.AutoDetectChangesEnabled = false;
        this.Configuration.ValidateOnSaveEnabled = false;
    }
    // dbsets...
}

如何避免此异常,因为我想将此扩展用于EF?

1 个答案:

答案 0 :(得分:0)

Delete方法是立即操作。

调用它时,您不需要在SaveChanges之后再调用,因此不会收到此错误。


目前尚不清楚您使用的是哪个库(在问题中您说的是“ EF批量删除扩展”,但最初标记为“ entity-framework-extended”。

免责声明:我是所有这些产品的所有者。

自2014年以来,不再支持

EF Extended

建议移至:

这些产品都具有此功能。

相关问题