2

次のフローがあります。

  1. エンティティが作成されます
    • 現在のコンテキストは閉じられています
  2. 更新しました
    • プロパティセッター別、ナビゲーションプロパティ別
  3. ViewStateに入れる
    • シリアル化された、[Serializable]属性でマークされたタイプ)
  4. ViewStateから読み取る
    • デシリアライズ
  5. 保存する
    • 新しいコンテキストが開いています

エンティティを適切に作成するにはどうすればよいですか:スタブ(デフォルトではコンストラクター)またはDbSet<T>.Create()

エンティティを適切に保存するにはどうすればよいですか:DbSet<T>.Add()またはDbSet<T>.Attach()

さまざまな例外が発生しています。

  • "PRIMARYKEY制約'PK_currency_types'の違反。オブジェクト'dbo.currency_types'に重複キーを挿入できません。重複キー値は(1)です。ステートメントは終了しました。"

  • 「参照整合性制約違反が発生しました:参照制約を定義するプロパティ値が、関係のプリンシパルオブジェクトと依存オブジェクトの間で一貫していません。」

DbContextGenerator拡張機能を備えたEF4.3Database 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();
    }
}

}

4

1 に答える 1

0
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();
于 2012-06-09T19:19:32.770 に答える