【问题标题】:How to create and save a serialized and then deserialized entity in EF如何在 EF 中创建和保存序列化然后反序列化的实体
【发布时间】:2012-06-08 17:13:40
【问题描述】:

我有以下流程:

  1. 实体已创建
    • 当前上下文已关闭
  2. 已更新
    • 通过属性设置器,也通过导航属性
  3. 放入 ViewState
    • 已序列化,类型用 [Serializable] 属性标记)
  4. 从 ViewState 读取
    • 反序列化
  5. 保存
    • 新上下文已打开

我应该如何正确创建实体:存根(默认构造函数)或DbSet<T>.Create()

我应该如何正确保存实体:DbSet<T>.Add()DbSet<T>.Attach()

我遇到了各种异常:

  • “违反 PRIMARY KEY 约束 'PK_currency_types'。无法在对象 'dbo.currency_types' 中插入重复键。重复键值为 (1)。语句已终止。”

    李>
  • “发生参照完整性约束违规:定义参照约束的属性值在关系中的主体对象和依赖对象之间不一致。”

我使用的是带有 DbContext Generator 扩展的 EF 4.3 Database First(我有数据库、设计器,但实体是自动生成的 POCO)。我是 EF 新手,完全被卡住了。

更新:这是我的代码,很简单,所以我没有从一开始就添加它:

public IStatement Create()
{
    using (var db = new ModelContainer())
    {
        // ID is auto-generated by db, INT IDENTITY(1,1)
        return new Statement();
        // or
        // return b.Statement.Create();
    }
}

// somewhere in the middle, for example:    
statement.Currency = db.Currency.Single(c => c.Name == "Euro");
statement.Amount = 1000;

public void Save(IStatement[] statement)
{
    using (var scope = new TransactionScope())
    using (var db = new ModelContainer())
    {
        foreach (var s in statement)
        {
            // statement has a number of navigation properties, i.e. referenced by FK entities

            // need to add/attach each back to db                
        }

        db.SaveChanges();
        scope.Complete();
    }
}

}

【问题讨论】:

  • Thisthis 应该会有所帮助。
  • @GertArnold:看起来很乐观,谢谢!但是,如果我先调用 Create(),Attach() 或 Entry() 仍然会产生“发生引用完整性约束违规”异常。
  • 也许显示一些代码可以帮助我们。
  • @GertArnold:当然,添加了一些代码。无论如何感谢您的帮助和文章!

标签: c# entity-framework exception-handling entity-framework-4.3 ef-database-first


【解决方案1】:
var statement = new Statement();

using (var scope = new TransactionScope())
{
    var result = 0;
    foreach (var statement in arr.Cast<Statement>())
    {
        using (var db = new ModelContainer())
        {
            db.StatementTypes.Attach(statement.StatementType);
            db.Entry(statement.StatementType).State = EntityState.Unchanged;

            db.Currencies.Add(statement.Currency);
            db.Entry(statement.Currency).State = EntityState.Unchanged;

            db.Subjects.Attach(statement.Firm);
            db.Entry(statement.Firm).State = EntityState.Unchanged;

            db.Statement.Add(statement);

            db.SaveChanges();
        }
    }
    scope.Complete();

【讨论】:

  • @GertArnold:我发现了这个看起来很脏的解决方法。你不知道更好的方法吗?谢谢!
猜你喜欢
  • 2014-12-19
  • 2013-01-24
  • 2021-11-28
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2011-09-26
相关资源
最近更新 更多