1

我有一个存储库类,如下所示。有一个获取实体对象的方法——GetPaymentByID。我正在检索一个 Payment 对象并对它的 PaymentType 属性进行更改。但这并没有反映在数据库中。我知道原因——SaveContextChanges 方法使用了一个新的上下文。

我需要使用每个请求的上下文方法。因此,我在每种方法中都创建了新的上下文。

在这种情况下,如何修改代码才能成功更新数据库?

注意:客户端程序不应使用 ObjectContext,因为可以使用不使用 Entity Framework 的另一个存储库来更改存储库

注意:“ 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 -实体状态.aspx

  2. 初始化实体框架上下文的最佳方法?

  3. Entity Framework 4.1:如何使用每次调用生命周期数据上下文?

  4. 在 EF4.1 中正确地从上下文中附加和分离实体

  5. 存储库和工作单元模式中的上下文生命周期管理

  6. 实体框架多对象上下文

  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 回答