Asp.net core DbContext.SaveChanges覆盖的行为异常

Asp.net core DbContext.SaveChanges覆盖的行为异常,asp.net-core,entity-framework-core,dbcontext,Asp.net Core,Entity Framework Core,Dbcontext,我有一个EFCore、.NET5应用程序。我的大多数模型都使用基类: 公共类基模型 { [关键] 公共int Id{get;set;} [最大长度(512),必填] 公共字符串名称{get;set;} [长度(8192)] 公共字符串说明{get;set;} [数据库生成(DatabaseGeneratedOption.Identity)] public DateTime CreatedOn{get;set;}=DateTime.UtcNow; [DatabaseGenerated(Databa

我有一个EFCore、.NET5应用程序。我的大多数模型都使用基类:

公共类基模型
{
[关键]
公共int Id{get;set;}
[最大长度(512),必填]
公共字符串名称{get;set;}
[长度(8192)]
公共字符串说明{get;set;}
[数据库生成(DatabaseGeneratedOption.Identity)]
public DateTime CreatedOn{get;set;}=DateTime.UtcNow;
[DatabaseGenerated(DatabaseGenerateOptions.Identity),必填]
通过{get;set;}=“Admin;”创建的公共字符串;
[必需]
public DateTime UpdatedOn{get;set;}=DateTime.UtcNow;
[必需]
公共字符串由{get;set;}=“Admin”更新;
}
我还有一个配置文件:

公共虚拟空间配置(EntityTypeBuilder)
{
属性(b=>b.CreatedOn).HasDefaultValueSql(“GETUTCDATE()”).ValueGeneratedNever();
builder.Property(b=>b.CreatedBy).HasDefaultValue(“外部”).valueGeneratedAnd();
属性(b=>b.updateOn).HasDefaultValueSql(“GETUTCDATE()”);
属性(b=>b.UpdatedBy).HasDefaultValue(“外部”);
}
我重写
savechangesync()
方法,尝试自动添加和更新创建和更新的属性:

public override Task savechangesync(CancellationToken CancellationToken=new())
{
var条目=ChangeTracker
.条目()
其中(e=>e.Entity是BaseModel&&
e、 状态为EntityState.Added或EntityState.Modified);
foreach(条目中的var entityEntry)
{
如果(entityEntry.State为EntityState.Detached或EntityState.Unchanged)继续;
((BaseModel)entityEntry.Entity).UpdateOn=DateTime.UtcNow;
((BaseModel)entityEntry.Entity).UpdatedBy=\u userId;
if(entityEntry.State==EntityState.Added)
{
((BaseModel)entityEntry.Entity).CreatedOn=DateTime.UtcNow;
((BaseModel)entityEntry.Entity).CreatedBy=\u userId;
}
}
返回base.saveChangesSync(cancellationToken);
}
我想实现的是,
CreatedOn
CreatedBy
仅在插入时更新。但它们也在不断更新

这看起来不错:

插入到[组织]([CreatedBy]、[CreatedOn]、[Description]、[Name]、[UpdatedBy]、[UpdatedOn]、[UserProfileId])
这并不是:

UPDATE[Organization]SET[CreatedBy]=@p0[CreatedOn]=@p1[Description]=@p2[Name]=@p5[UpdatedBy]=@p6[UpdatedOn]=@p7[UserProfileId]=@p8
如果没有
CreatedBy
CreatedOn
,我会希望有一个update语句:

UPDATE[Organization]SET[Description]=@p2、[Name]=@p5、[UpdatedBy]=@p6、[UpdatedOn]=@p7、[UserProfileId]=@p8
现在,这些属性被默认值覆盖

我看了很多例子,整天都在尝试不同的选择,但我不知道我做错了什么。请给我一些建议


我在获取UserProfileId时也遇到了问题,但我将为此创建一个新问题。

多亏了@IvanStoev的建议,我终于找到了一个有效的解决方案

我补充说

if(entityEntry.State==EntityState.Modified)
{
entityEntry.Property(“CreatedOn”).IsModified=false;
entityEntry.Property(“CreatedBy”).IsModified=false;
}

到my
SaveChangesSync()
并删除配置中的
ValueGenerated*
属性,并删除基本模型中的
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
属性。

谢谢Ivan。你的建议帮助我找到了一个可行的解决办法。我把我的答案贴出来作为答案。