上下文每个请求:如何更新实体上下文、实体

2023-09-03 03:06:06 作者:当初遇你如遇春风

我有一个仓储类,如下图所示。有一个方法来获得实体对象 - GetPaymentByID。我检索支付对象,并在更改其PaymentType财产。但是,这并没有反映在DATABSE。我知道了原因 - SaveContextChanges方法使用一个新的环境。

我需要使用上下文每请求办法。因此,我在每一个方法创建新的上下文。

在这种情况下,我怎么能修改code成功地更新数据库?

注:客户端程序不应该使用ObjectContext的,因为在存储库可以与其它存储库来改变不使用实体框架

注意:一个DataContext是轻量级的,不贵创建的

 命名空间MyRepository
{


公共类MyPaymentRepository
{
    私人字符串connectionStringVal;
    公共MyPaymentRepository()
    {
        SqlConnectionStringBuilder sqlBuilder =新SqlConnectionStringBuilder();
        sqlBuilder.DataSource =。;
        sqlBuilder.InitialCatalog =LibraryReservationSystem;
        sqlBuilder.IntegratedSecurity = TRUE;

        //初始化EntityConnectionStringBuilder。
        EntityConnectionStringBuilder entityBuilder =新EntityConnectionStringBuilder();
        entityBuilder.Provider =System.Data.SqlClient的;
        entityBuilder.ProviderConnectionString = sqlBuilder.ToString();
        entityBuilder.Metadata = @RES://*/MyEDMtest.csdl |高分辨率://*/MyEDMtest.ssdl |高分辨率://*/MyEDMtest.msl;

        connectionStringVal = entityBuilder.ToString();
    }




    公共MyEntityDataModelEDM.Payment GetPaymentByID(INT paymentID)
    {
        MyEntityDataModelEDM.Payment付款;
        使用(VAR myObjectContext2 =新MyEntityDataModelEDM.LibraryReservationSystemEntities(connectionStringVal))
        {

            FUNC< MyEntityDataModelEDM.Payment,布尔> predicate =(P => p.PaymentID == paymentID);
            支付= myObjectContext2.Payments.SingleOrDefault(predicate);
        }
        返回付款;
    }


    公共无效SaveContextChanges(MyEntityDataModelEDM.Payment paymentEntity)
    {
        使用(VAR myObjectContext =新MyEntityDataModelEDM.LibraryReservationSystemEntities(connectionStringVal))
        {
            myObjectContext.SaveChanges();
        }
    }


}


}
 
EF Core中如何获取上下文中操作过的实体

客户端

  MyRepository.MyPaymentRepository代表=新MyRepository.MyPaymentRepository();

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

阅读

添加/安装和实体的国家:http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx

Best方法来初始化一个实体的框架范围内?

Entity框架4.1:怎么每次通话续航时间数据的情况下一起工作

Attaching和分离的背景下实体正确EF4.1

Context生命周期管理的存储库和单位的工作模式

实体框架的多目标上下文

EF4 - Context.Entry不可更改实体状态

解决方案

您需要添加(如果数据是新的)或附加(如果该数据被编辑)对象上下文:

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

这些方针的东西:

 公共无效SaveContextChanges(MyEntityDataModelEDM.Payment paymentEntity)
{
    使用(VAR myObjectContext =新MyEntityDataModelEDM.LibraryReservationSystemEntities(connectionStringVal))
    {
        //使用自己的逻辑来确定新实体
        myObjectContext.Entry(paymentEntity).State =
                (paymentEntity.PaymentID ==默认(INT))?
                               EntityState.Added:
                               EntityState.Modified;

        myObjectContext.SaveChanges();
    }
}
 

I have a repository class as shown below. There is a method to get entity object – GetPaymentByID. I am retrieving a Payment object and making a change to its PaymentType property. But this is not reflected in databse. I know the reason – the SaveContextChanges method uses a new context.

I need to use Context Per Request approach. Hence I am creating new context in each method.

In this scenario, how can I modify the code to successfully update the database?

Note: The client program should not use the ObjectContext because the repository can be changed with another repository that does not use Entity Framework.

Note: "A DataContext is lightweight and is not expensive to create"

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


}


}

Client

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

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

READING

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

Best way to initialize an entity framework context?

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

Attaching and detaching entities from context correctly in EF4.1

Context lifetime management in repository and unit of work pattern

Entity Framework Multiple Object Contexts

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

解决方案

You need to add (if the data is new) or attach (if the data is edited) the object to the context:

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

Something along these lines:

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

 
精彩推荐
图片推荐