gpt4 book ai didi

c# - 如何在 EF 中创建和保存序列化然后反序列化的实体

转载 作者:太空宇宙 更新时间:2023-11-03 16:30:32 24 4
gpt4 key购买 nike

我有以下流程:

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

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

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

我遇到了各种异常:

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

    <
  • “发生引用完整性约束冲突:定义引用约束的属性值在关系中的主体对象和依赖对象之间不一致。”

我正在使用带有 DbContext 生成器扩展的 EF 4.3 数据库优先(我有数据库、设计器,但实体是自动生成的 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();
}
}

最佳答案

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();

关于c# - 如何在 EF 中创建和保存序列化然后反序列化的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10953216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com