.net EF Core未发送所有修改字段进行更新
我正在做一个简单的更新(使用EF Core 3.1.2和SQL后端),但无法了解一个字段无法发送到db的原因 我有一个更新呼叫,在那里我可以看到我想要发送的DateModified的值: 但是,使用SQL Profiler,我可以看到这是实际发送的内容,DateModified字段根本没有发送到SQL: 以下是尝试发送的对象:.net EF Core未发送所有修改字段进行更新,.net,entity-framework,.net,Entity Framework,我正在做一个简单的更新(使用EF Core 3.1.2和SQL后端),但无法了解一个字段无法发送到db的原因 我有一个更新呼叫,在那里我可以看到我想要发送的DateModified的值: 但是,使用SQL Profiler,我可以看到这是实际发送的内容,DateModified字段根本没有发送到SQL: 以下是尝试发送的对象: public class AVO : BasePropertiesWithID { //[Authorize(Policy = "AllEmployees")
public class AVO : BasePropertiesWithID
{
//[Authorize(Policy = "AllEmployees")]
[ForeignKey("DivisionID")]
public int DivisionID { get; set; }
[Required]
public int AccountNumber { get; set; }
[Required]
public string CustomerName { get; set; }
[Required]
public string Comments { get; set; }
public bool IsActive { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
[UseFiltering]
[UseSorting]
public virtual Division Division { get; set; }
}
下面是包含DateModified字段(未发送)和DateInserted字段(已发送)的基类:
public class BasePropertiesWithID
{
[Key]
[Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required]
[Column(Order = 9990)]
[DefaultValue("autoProcess")]
public string InsertedBy { get; set; }
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
[Required]
[Column(Order = 9991)]
public DateTime DateInserted { get; set; }
[Required]
[Column(Order = 9992)]
[DefaultValue("autoProcess")]
public string ModifiedBy { get; set; }
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
[Required]
[Column(Order = 9993)]
public DateTime DateModified { get; set; }
}
我已经使用这个基类很长一段时间了,没有遇到任何问题,也没有EF的版本。我的信息搜索一直不成功,虽然我确实发现这对我没有帮助
为什么一个字段甚至不能被发送?有人能提供为什么或如何解决这个问题吗??谢谢
编辑:如何将此实体添加到EF
为什么一个字段甚至不能被发送
因为您已将属性配置为在添加或更新时生成其值:
它指示EF在每次更新后从数据库重新加载该值。要应用客户端更新,您必须将SetAfterSaveBehavior
设置为propertysavebhavior。在模型中保存,如下所示:
modelBuilder.Entity<Person>().Property(b => b.ModifiedAt).Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Save);
为了清楚起见,我相信您使用的是ef-6而不是core。。。您应该声明…@Seabizkit我使用EF Core 3.1.2进行澄清,我假设与此无关,但[列(Order=9992)]
在Core中不起作用。回到你的问题最有趣的看起来100%正确我的猜测是删除配置中的行。。。这是用于修改为ValueGeneratedAndorUpdate的数据。。。看看发生了什么哇。谢谢你的信息。看起来是最近的一个问题。12天前,增加了一个解决方案。我将进一步挖掘,并以我最终实现的内容作为回应。谢谢@Seabizkit!非常感谢大卫·布朗。最初,@Seabizkit让我找到了正确的方向,找到了许多问题/观点。我最终只是简单地将基本实体属性更改为ValueGeneratedOnAdd,因为我正在发送值,并且它按照预期工作;但所有这些最有价值的方面是了解它的实际工作原理,找出ValueGenerator为何为空,并能够创建ValueGenerator来完成我真正希望它做的事情。我肯定地说,这是一个可以澄清的文件问题。非常感谢你们两位!
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Query;
using Microsoft.EntityFrameworkCore.SqlServer;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Threading.Tasks;
namespace EfCore3Test
{
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime ModifiedAt { get; set; }
}
public class Db : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Person>().Property(p => p.ModifiedAt).HasDefaultValueSql("getdate()").ValueGeneratedOnAddOrUpdate();
modelBuilder.Entity<Person>().Property(b => b.ModifiedAt).Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Save);
}
private static readonly ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddFilter((category, level) =>
category == DbLoggerCategory.Database.Command.Name
&& level == LogLevel.Information).AddConsole();
});
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLoggerFactory(loggerFactory)
.UseSqlServer("Server=.;database=EfCore3Test;Integrated Security=true",
o => o.UseRelationalNulls());
base.OnConfiguring(optionsBuilder);
}
}
class Program
{
static void Main(string[] args)
{
using var db = new Db();
db.Database.EnsureDeleted();
db.Database.EnsureCreated();
var p = new Person() { Name = "Fred" };
db.Set<Person>().Add(p);
db.SaveChanges();
p.Name = "Fred2";
p.ModifiedAt = DateTime.Now.AddDays(-7);
db.Set<Person>().Update(p);
db.SaveChanges();
}
}
}
}
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (0ms) [Parameters=[@p2='?' (DbType = Int32), @p0='?' (DbType = DateTime2), @p1='?' (Size = 4000)], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
UPDATE [Person] SET [ModifiedAt] = @p0, [Name] = @p1
WHERE [Id] = @p2;
SELECT @@ROWCOUNT;