简体   繁体   English

EF Core,FromSqlRaw 给出与查询不同的结果

[英]EF Core, FromSqlRaw gives different result than query

I Use EF core 5, in do.net 5, and i have this strange behavior of my FromSQLRaw call.我在 do.net 5 中使用 EF core 5,我的 FromSQLRaw 调用有这种奇怪的行为。 When i call a Table value function.当我调用表值 function 时。

The first time i call it everything is fine, and it uses my date paramter correct, but when i call it to update it, it seems to generate the correct query, but the result is the same as the intial call, even though i call it with a different date.我第一次调用它一切都很好,它使用我的日期参数正确,但是当我调用它更新它时,它似乎生成了正确的查询,但结果与初始调用相同,即使我调用它有一个不同的日期。

When i run当我跑

query.ToQueryString()

It returns the query i would expect, and when running that in some other software i also get the result i would expect.它返回我期望的查询,当在其他一些软件中运行它时,我也得到了我期望的结果。 So my SQL string is fine.所以我的 SQL 字符串没问题。

public async Task<List<OverUnderAfdækningModel>> HentOverUnder(DateTime date)
        {
            var dateParam = new SqlParameter("@Dato", date);
            var query = mOHandelsDbContext.OverUnderAfdæknings.FromSqlRaw("SELECT * From [MO_Handelsdata].[OverUnder].OverUnderAfdækning(@Dato)", parameters: new[] { dateParam });
            var result = await query.ToListAsync();
            return result ;
            
        }

in my startup file i have在我的启动文件中

services.AddDbContext<MOHandelsDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MO_Handelsdata")));

And my service constructor looks like我的服务构造函数看起来像

public OverUnderAfdækningService(MOHandelsDbContext _mOHandelsDbContext, MORammerDbContext _mORammerDbContext)
        {
            mOHandelsDbContext = _mOHandelsDbContext;
            mORammerDbContext = _mORammerDbContext;
        }

I call the service from Blazor like below, where UpdateData is bound to a button, and SelectedDate is a DateTime bound to a datepicker我从 Blazor 调用该服务,如下所示,其中 UpdateData 绑定到一个按钮,而 SelectedDate 是一个绑定到日期选择器的 DateTime

protected override async Task OnInitializedAsync()
    {

        await getData();
    }
async Task UpdateData()
    {
        OverUnderAfdækninger.Clear();
        getData();
    }
async Task getData()
    {

        OverUnderAfdækninger = await OverUnderAfdækningService.HentOverUnder(SelectedDate);
    }

My dbcontext looks like我的 dbcontext 看起来像

public class MOHandelsDbContext : DbContext
    {
        public virtual DbSet<OverUnderAfdækningModel> OverUnderAfdæknings { get; set; }

        public MOHandelsDbContext(DbContextOptions<MOHandelsDbContext> options) : base(options)
        {

        }


        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder
                .Entity<OverUnderAfdækningModel>(builder =>
                {
                    builder.ToTable("OverUnderAfdækningModel");
                });

        }
    }

It was an issue with caching.这是缓存的问题。

Adding AsNoTracking() behind the query fixed it for me在查询后面添加 AsNoTracking() 为我修复了它

var query = mOHandelsDbContext
.OverUnderAfdæknings
.FromSqlInterpolated($"SELECT * From [MO_Handelsdata].[OverUnder].OverUnderAfdækning({date})")
.AsNoTracking();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM