gpt4 book ai didi

sql-server - EF Core 强制刷新数据库中的实体(强制从数据库获取值)

转载 作者:行者123 更新时间:2023-12-03 14:56:48 25 4
gpt4 key购买 nike

我想了解如何使用 Entity Framework Core 加载/获取实体的当前数据库值(“从数据库强制重新加载”)。
我的属性如下所示:

[Column(TypeName = "decimal(16, 2)")]
public decimal Fee { get; set; }

如果费用以比列属性中指定的精度更高的精度保存,例如 1,2888 数据库将其四舍五入到两位小数,但我保存的实体没有得到更新。

因此,我尝试从数据库重新加载值以在此 UI 中显示“正确的当前”值,但以下两种方法均无效:
// removed from tracked entities and fetch from db
dbContext.Entry(entity).State = EntityState.Detached;
dbContext.Find(...);

// call reload
dbContext.Entry(entity).Reload();

预计刷新/重新加载后值为 1,29 ,但它始终保持 1,2888 。我在数据库中查找了值,它是 1,29 并且下一个请求将返回 1,29 但我没有设法在同一个请求中返回正确的值。

有没有办法“强制刷新”数据库中的实体?

- - 编辑 - -

问题是我有一个带有导航属性的实体,小数点在导航属性上,在实体本身上调用 .Reload() 时没有重新加载。

代码
using System;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;

namespace WebApplication1
{
public class Entity
{
public long Id { get; set; }

public Fee Fee { get; set; }
}

public class Fee
{
public long Id { get; set; }

[Column(TypeName = "decimal(16, 2)")]
public decimal Value { get; set; }
}


public class MyContext : DbContext
{
public DbSet<Entity> Entities { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer(@"connectionString");
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}
}

public class Program
{
public static void Main()
{
AsyncMethod().GetAwaiter().GetResult();
}

private static async Task AsyncMethod()
{
using (var context = new MyContext())
{
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
}

using (var context = new MyContext())
{
var entity = new Entity {Fee = new Fee {Value = 12.3456789m}};
context.Add(entity);
await context.SaveChangesAsync();
Console.WriteLine($"Fee value after SaveChanges() {entity.Fee.Value}");
await context.Entry(entity).ReloadAsync();
Console.WriteLine($"Fee value after Reload() {entity.Fee.Value}");
}

using (var context = new MyContext())
{
var entity = await context.Entities.OrderByDescending(x => x.Id).Include(x => x.Fee).FirstAsync();
Console.WriteLine($"Fee value after Disposing and Recreating Context {entity.Fee.Value}");
}

}
}
}

输出:
Fee value after SaveChanges() 12,3456789
Fee value after Reload() 12,3456789
Fee value after Disposing and Recreating Context 12,35

最佳答案

有限情况下的可能解决方案
有时 AsNoTracking如果您只需要加载数据而不需要维护整个对象上下文,则可以是一个解决方案。 https://docs.microsoft.com/en-us/ef/core/querying/tracking
例如,我只是有一个案例,我需要:

  • 加载单行
  • 启动 Hangfire 任务(在其自己的上下文中运行)
  • 原方法几秒后查看状态

  • 通过使用 AsNoTracking我能够两次加载同一行,但没有看到任何缓存。
    var shipmentData = await context.Shipments.AsNoTracking().Single(s => s.ShipmentId == shipmentId);
    但是,如果您确实需要将此行保存回来,则此方法可能会导致管理困惑或丢失更改的风险。

    关于sql-server - EF Core 强制刷新数据库中的实体(强制从数据库获取值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51785156/

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