【发布时间】:2012-06-08 17:13:40
【问题描述】:
我有以下流程:
- 实体已创建
- 当前上下文已关闭
- 已更新
- 通过属性设置器,也通过导航属性
- 放入 ViewState
- 已序列化,类型用 [Serializable] 属性标记)
- 从 ViewState 读取
- 反序列化
- 保存
- 新上下文已打开
我应该如何正确创建实体:存根(默认构造函数)或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();
}
}
}
【问题讨论】:
-
@GertArnold:看起来很乐观,谢谢!但是,如果我先调用 Create(),Attach() 或 Entry() 仍然会产生“发生引用完整性约束违规”异常。
-
也许显示一些代码可以帮助我们。
-
@GertArnold:当然,添加了一些代码。无论如何感谢您的帮助和文章!
标签: c# entity-framework exception-handling entity-framework-4.3 ef-database-first