gpt4 book ai didi

entity-framework - Entity Framework 5 - 保存更改后立即刷新 DbContext

转载 作者:行者123 更新时间:2023-12-04 15:23:41 24 4
gpt4 key购买 nike

我有一个使用 Entity Framework 5 的 MVC 应用程序。在少数地方我有一个创建或更新实体的代码,然后必须对更新的数据执行某种操作。其中一些操作需要访问导航属性,我无法让它们刷新。

这是示例(我拥有的简化代码)

型号

class User : Model
{
public Guid Id { get; set; }
public string Name { get; set; }
}

class Car : Model
{
public Guid Id { get; set; }
public Guid DriverId { get; set; }
public virtual User Driver { get; set; }

[NotMapped]
public string DriverName
{
get { return this.Driver.Name; }
}
}

Controller
public CarController
{
public Create()
{
return this.View();
}

[HttpPost]
public Create(Car car)
{
if (this.ModelState.IsValid)
{
this.Context.Cars.Create(booking);
this.Context.SaveChanges();

// here I need to access some of the resolved nav properties
var test = booking.DriverName;
}

// error handling (I'm removing it in the example as it's not important)
}
}

上面的示例是针对 Create 方法的,但我也有与 Update 方法相同的问题,它非常相似,它只是从 GET 中的上下文中获取对象。操作并使用 Update 存储它 POST 中的方法行动。
public virtual void Create(TObject obj)
{
return this.DbSet.Add(obj);
}

public virtual void Update(TObject obj)
{
var currentEntry = this.DbSet.Find(obj.Id);
this.Context.Entry(currentEntry).CurrentValues.SetValues(obj);
currentEntry.LastModifiedDate = DateTime.Now;
}

现在,我尝试了几种不同的方法,这些方法在 Google 上搜索或在堆栈上找到,但似乎没有什么对我有用。

在我最近的尝试中,我尝试在调用 SaveChanges 后强制重新加载方法并从数据库中重新查询数据。这就是我所做的。

我已经覆盖了 SaveChanges保存后立即刷新对象上下文的方法
public int SaveChanges()
{
var rowsNumber = this.Context.SaveChanges();
var objectContext = ((IObjectContextAdapter)this.Context).ObjectContext;
objectContext.Refresh(RefreshMode.StoreWins, this.Context.Bookings);

return rowsNumber;
}

我尝试通过在 SaveChanges 之后立即添加这行代码来获取更新的对象数据。调用我的 HTTP CreateUpdate行动:
car = this.Context.Cars.Find(car.Id);

不幸的是,导航属性仍然​​是 null .如何在修改数据后立即正确刷新 DbContext?

编辑

我忘了最初提到我知道一种解决方法,但它很难看,我不喜欢它。每当我使用导航属性时,我都可以检查它是否为 null如果是,我可以手动创建新的 DbContext 并更新数据。但我真的很想避免这样的黑客攻击。
class Car : Model
{
[NotMapped]
public string DriverName
{
get
{
if (this.Driver == null)
{
using (var context = new DbContext())
{
this.Driver = this.context.Users.Find(this.DriverId);
}
}

return this.Driver.Name;
}
}
}

最佳答案

问题可能是由于您添加到上下文中的项目不是 proxy具有延迟加载所需的所有组件。即使在调用 SaveChanges() 之后该项目不会被转换为代理实例。

我建议您尝试使用 DbSet.Create() 方法并复制您通过网络接收到的实体中的所有值:

public virtual TObject Create(TObject obj)
{
var newEntry = this.DbSet.Create();
this.Context.Entry(newEntry).CurrentValues.SetValues(obj);
return newEntry;
}

更新

如果 SetValues()给出一个问题然后我建议你尝试 automapper将数据从传入的实体传输到 Add 之前创建的代理将新代理实例添加到 DbSet .像这样的东西:
private bool mapCreated = false;
public virtual TObject Create(TObject obj)
{
var newEntry = this.DbSet.Create();

if (!mapCreated)
{
Mapper.CreateMap(obj.GetType(), newEntry.GetType());
mapCreated = true;
}
newEntry = Mapper.Map(obj, newEntry);

this.DbSet.Add(newEntry;
return newEntry;
}

关于entity-framework - Entity Framework 5 - 保存更改后立即刷新 DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17487122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com