【问题标题】:Context Per Request: How to update Entity每个请求的上下文:如何更新实体
【发布时间】:2012-07-17 13:11:54
【问题描述】:

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

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

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

注意:客户端程序不应使用 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. Best way to initialize an entity framework context?

  3. Entity Framework 4.1: how to work with per call life time data context?

  4. Attaching and detaching entities from context correctly in EF4.1

  5. Context lifetime management in repository and unit of work pattern

  6. Entity Framework Multiple Object Contexts

  7. EF4 - Context.Entry isn't available to change an Entity State

【问题讨论】:

    标签: c# .net entity-framework design-patterns domain-driven-design


    【解决方案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

    类似的东西:

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

    【讨论】:

    • 请参见 new MyEntityDataModelEDM.LibraryReservationSystemEntities() 行。我在这里创建了一个新的上下文,不是吗?这个上下文如何知道先前上下文对象所做的更改?
    • 将状态设置为Modified 告诉上下文实体已被修改并且应该在数据库中更新。对象来自哪里并不重要。
    • 我在这种方法中遇到了错误。请看stackoverflow.com/questions/11576911/…
    猜你喜欢
    • 2023-02-10
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    相关资源
    最近更新 更多