1

以下に示すようなリポジトリクラスがあります。エンティティオブジェクトを取得するメソッド–GetPaymentByIDがあります。Paymentオブジェクトを取得し、そのPaymentTypeプロパティに変更を加えています。しかし、これはデータベースには反映されていません。私はその理由を知っています–SaveContextChangesメソッドは新しいコンテキストを使用します。

リクエストごとのコンテキストアプローチを使用する必要があります。したがって、私は各メソッドで新しいコンテキストを作成しています。

このシナリオでは、データベースを正常に更新するためにコードを変更するにはどうすればよいですか?

注:リポジトリはEntity Frameworkを使用しない別のリポジトリで変更できるため、クライアントプログラムはObjectContextを使用しないでください。

:「DataContextは軽量で、作成するのに費用がかかりません

namespace MyRepository
{


public class MyPaymentRepository
{
    private string connectionStringVal;
    public MyPaymentRepository()
    {
        SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
        sqlBuilder.DataSource = ".";
        sqlBuilder.InitialCatalog = "LibraryReservationSystem";
        sqlBuilder.IntegratedSecurity = true;

        // Initialize the EntityConnectionStringBuilder.
        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
        entityBuilder.Provider = "System.Data.SqlClient";
        entityBuilder.ProviderConnectionString = sqlBuilder.ToString();
        entityBuilder.Metadata = @"res://*/MyEDMtest.csdl|res://*/MyEDMtest.ssdl|res://*/MyEDMtest.msl";

        connectionStringVal = entityBuilder.ToString();
    }




    public MyEntityDataModelEDM.Payment GetPaymentByID(int paymentID)
    {
        MyEntityDataModelEDM.Payment payment;
        using (var myObjectContext2 = new MyEntityDataModelEDM.LibraryReservationSystemEntities(connectionStringVal))
        {

            Func<MyEntityDataModelEDM.Payment, bool> predicate = (p => p.PaymentID == paymentID);
            payment = myObjectContext2.Payments.SingleOrDefault(predicate);
        }
        return payment;
    }


    public void SaveContextChanges(MyEntityDataModelEDM.Payment paymentEntity)
    {
        using (var myObjectContext = new MyEntityDataModelEDM.LibraryReservationSystemEntities(connectionStringVal))
        {
            myObjectContext.SaveChanges();
        }
    }


}


}

クライアント

        MyRepository.MyPaymentRepository rep = new MyRepository.MyPaymentRepository();

        MyEntityDataModelEDM.Payment p2= rep.GetPaymentByID(1);
        p2.PaymentType = "TeSSS";
        rep.SaveContextChanges(p2);

読む

  1. 追加/添付およびエンティティの状態:http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and -entity-states.aspx

  2. エンティティフレームワークコンテキストを初期化する最良の方法は?

  3. Entity Framework 4.1:コールライフタイムデータコンテキストごとにどのように機能するか?

  4. EF4.1でのコンテキストへのエンティティのアタッチとデタッチ

  5. リポジトリおよび作業単位パターンでのコンテキストライフタイム管理

  6. EntityFramework複数のオブジェクトコンテキスト

  7. EF4-Context.Entryは、エンティティの状態を変更するために使用できません

4

1 に答える 1

2

オブジェクトをコンテキストに追加 (データが新しい場合) またはアタッチ (データが編集されている場合) する必要があります。

http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx

これらの行に沿ったもの:

public void SaveContextChanges(MyEntityDataModelEDM.Payment paymentEntity)
{
    using (var myObjectContext = new MyEntityDataModelEDM.LibraryReservationSystemEntities(connectionStringVal))
    {
        // use your own logic for determining a "new" entity
        myObjectContext.Entry(paymentEntity).State = 
                (paymentEntity.PaymentID == default(int)) ?  
                               EntityState.Added :
                               EntityState.Modified;

        myObjectContext.SaveChanges();
    }
}
于 2012-07-18T13:30:00.383 に答える