這很奇怪,以前從未見過這樣的事情。我有一個我有一段時間沒有接觸過的舊專案,它的設定使用 Linq to Entities 和代碼優先。我嘗試從作品中選擇資料的每個物體,但生成的 SQL 不包含 where 子句。(我可以看到在 SQL Profiler 中生成了什么)所以應用程式基本上是從表中選擇所有行,然后在服務器上進行過濾,這并不好。我的專案是使用Microsoft.EntityFrameworkCore匯編版本的.Net Core 2.22.2.6.0
我覺得這可能是配置錯誤,但我沒有發現任何問題。以前有人見過這樣的嗎?
不管這個問題是什么,當我試圖保存一個國家物體時,它也會給我帶來這個例外;這是沒有意義的,因為 CountryId 是下面代碼優先設定中的主鍵,我絕對沒有分配它。
Cannot insert explicit value for identity column in table 'Country' when IDENTITY_INSERT is set to OFF.
我嘗試了不同的選擇變體,但沒有一個生成 where 子句。
var country = await _taxContext.Countries
.FirstOrDefaultAsync(a => a.TwoLetterISOCode.Equals(country.jurisCode, StringComparison.OrdinalIgnoreCase))
.ConfigureAwait(false);
-- generates this sql
SELECT [a].[CountryId], [a].[Name], [a].[TwoLetterISOCode]
FROM [dbo].[Country] AS [a]
var exists = await _taxContext.Countries
.AnyAsync(a => a.TwoLetterISOCode.Equals(country.jurisCode, StringComparison.OrdinalIgnoreCase))
.ConfigureAwait(false);
-- generates this sql
SELECT [a].[TwoLetterISOCode]
FROM [dbo].[Country] AS [a]
這是我的國家物體 POCO
public class Country
{
public byte CountryId { get; private set; }
public string Name { get; set; }
public string TwoLetterISOCode { get; set; }
public ICollection<Nexus> Nexi { get; set; }
}
我的國家配置
class CountryConfiguration : IEntityTypeConfiguration<Country>
{
public void Configure(EntityTypeBuilder<Country> builder)
{
builder.ToTable(nameof(Country), "dbo");
builder.HasKey(ci => ci.CountryId);
builder.Property(ci => ci.Name)
.HasColumnType("nvarchar(75)");
builder.Property(ci => ci.TwoLetterISOCode)
.HasColumnType("char(2)");
builder.HasMany(ci => ci.Nexi)
.WithOne(ci => ci.Country);
}
}
和我的 DbContext
public class TaxContext : DbContext
{
public TaxContext(DbContextOptions<TaxContext> options) : base(options)
{
}
public DbSet<Region> Regions { get; set; }
public DbSet<Country> Countries { get; set; }
public DbSet<Nexus> Nexi { get; set; }
public DbSet<TaxRate> FallbackRates { get; set; }
public DbSet<CircuitBreakerLog> CircuitBreakerLogs { get; set; }
public DbSet<AppLog> AppLogs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.ApplyConfiguration(new NexusConfiguration())
.ApplyConfiguration(new RegionConfiguration())
.ApplyConfiguration(new CountryConfiguration())
.ApplyConfiguration(new TaxRateConfiguration())
.ApplyConfiguration(new CircuitBreakerLogConfiguration())
.ApplyConfiguration(new AppLogConfiguration());
}
}
啟動檔案
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TaxContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
uj5u.com熱心網友回復:
您應該在輸出中看到 EF 正在本地評估您的查詢的警告。這是因為您的字串比較。雖然我會支持 using string.Equals,但它不會支持您使用的多載。EF 不知道如何處理 ,StringComparison.OrdinalIgnoreCase因為它依賴于大小寫、重音等的資料庫排序規則。解決方案是使用簡單的多載或基本的==:
.FirstOrDefaultAsync(a => a.TwoLetterISOCode.Equals(country.jurisCode))
或者
.FirstOrDefaultAsync(a => a.TwoLetterISOCode == country.jurisCode)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359184.html
下一篇:將列舉引數與c#運算式一起使用
