gpt4 book ai didi

entity-framework - 如何在 DB first 方法中为实体设置创建日期和修改日期

转载 作者:行者123 更新时间:2023-12-03 15:13:11 25 4
gpt4 key购买 nike

在我们应用程序的每个 SQL 表中,我们都有“CreatedDate”和“ModifiedDate”列。我们正在使用数据库优先方法。当我保存数据时,我希望这两列自动填充。一种方法是将默认值设置为 getdate()在 SQL 表列本身上。所以这将部分解决问题。这意味着它将在实体为新实体时设置 CreatedDate 和 ModifiedDate。
但是,当我编辑/更新实体时,我只想要 ModifiedDate要被更新。
有很多文章使用代码优先的方法来做这件事。但我们使用的是数据库优先方法。
我在这里有什么选择?

最佳答案

查看 .NET Core 的答案:
https://stackoverflow.com/a/64824067/3850405
我喜欢这样使用的更通用的方法:

interface IEntityDate
{
DateTime CreatedDate { get; set; }

DateTime UpdatedDate { get; set; }
}

public abstract class EntityBase<T1>: IEntityDate
{
public T1 Id { get; set; }

public virtual DateTime CreatedDate { get; set; }
public virtual string CreatedBy { get; set; }
public virtual DateTime UpdatedDate { get; set; }
public virtual string UpdatedBy { get; set; }
}

public override int SaveChanges()
{
var now = DateTime.UtcNow;

foreach (var changedEntity in ChangeTracker.Entries())
{
if (changedEntity.Entity is IEntityDate entity)
{
switch (changedEntity.State)
{
case EntityState.Added:
entity.CreatedDate = now;
entity.UpdatedDate = now;
break;

case EntityState.Modified:
Entry(entity).Property(x => x.CreatedDate).IsModified = false;
entity.UpdatedDate = now;
break;
}
}
}

return base.SaveChanges();
}
更新:
办理 CreatedByUpdatedBy我使用 DbContext 的包装器,如下所示:
public interface IEntity
{
DateTime CreatedDate { get; set; }

string CreatedBy { get; set; }

DateTime UpdatedDate { get; set; }

string UpdatedBy { get; set; }
}

public interface ICurrentUser
{
string GetUsername();
}

public class ApplicationDbContextUserWrapper
{
public ApplicationDbContext Context;

public ApplicationDbContextUserWrapper(ApplicationDbContext context, ICurrentUser currentUser)
{
context.CurrentUser = currentUser;
this.Context = context;
}
}

public class ApplicationDbContext : DbContext
{

public ICurrentUser CurrentUser;

public override int SaveChanges()
{
var now = DateTime.UtcNow;

foreach (var changedEntity in ChangeTracker.Entries())
{
if (changedEntity.Entity is IEntity entity)
{
switch (changedEntity.State)
{
case EntityState.Added:
entity.CreatedDate = now;
entity.UpdatedDate = now;
entity.CreatedBy = CurrentUser.GetUsername();
entity.UpdatedBy = CurrentUser.GetUsername();
break;
case EntityState.Modified:
Entry(entity).Property(x => x.CreatedBy).IsModified = false;
Entry(entity).Property(x => x.CreatedDate).IsModified = false;
entity.UpdatedDate = now;
entity.UpdatedBy = CurrentUser.GetUsername();
break;
}
}
}

return base.SaveChanges();
}

...

关于entity-framework - 如何在 DB first 方法中为实体设置创建日期和修改日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37285948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com