Почему ядро ​​Entity Framework не вычисляет столбец должным образом на стороне сервера? - PullRequest
0 голосов
/ 27 мая 2020

У меня есть следующий DbContext:

public class TestDbContext : DbContext
    {
        public DbSet<DatabaseLogEntry> LogEntries { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<DatabaseLogEntry>().ToTable("LogEntryTable");
            modelBuilder.Entity<DatabaseLogEntry>().Property(x => x.URL).HasDefaultValueSql("TEST_URL");
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("connection_string");
        }
    }

И просто попробуйте добавить новую строку (в настоящее время URL-адрес равен нулю)

using(TestDbContext context = new TestDbContext())
            {
                context.LogEntries.Add(logEntry);
                context.SaveChanges();
            }

Но столбец «Url» не затронут и установлено значение null. Если я посмотрю на перехваченный запрос sql, сгенерированный EF, количество моих вопросов увеличится :) Почему он сгенерировал только запрос выбора для столбца «URL» без какой-либо вставки ...

exec sp_executesql N'SET NOCOUNT ON;
INSERT INTO [LogEntryTable] ([ID], [EVENT_TYPE], [FLAGS], [MESSAGE], [METHOD], [SERVER], [SEVERITY], [THREAD_ID], [TIME], [USERNAME])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9);
SELECT [URL]
FROM [LogEntryTable]
WHERE @@ROWCOUNT = 1 AND [ID] = @p0;

',N'@p0 bigint,@p1 nvarchar(4000),@p2 bigint,
@p3 nvarchar(4000),@p4 nvarchar(4000),@p5 nvarchar(4000),@p6 nvarchar(4000),@p7 bigint,@p8 datetime2(7),@p9 nvarchar(4000)',@p0=12027,@p1=N'value',@p2=1,
@p3=NULL,@p4=N'value',@p5=N'value',@p6=N'value',@p7=1,@p8='2020-05-27 19:24:38.1512712',@p9=N'value'

Когда я использую метод HasComputedColumnSql, ситуация аналогичная - в столбец вставляется только нулевое значение. Кто-нибудь может мне помочь?

...