gpt4 book ai didi

sql-server - DateCreated 或 Modified 列 - Entity Framework 或在 SQL Server 上使用触发器

转载 作者:行者123 更新时间:2023-12-02 08:11:49 25 4
gpt4 key购买 nike

在阅读附加链接中的一个问题后,我了解了如何在 Entity Framework 中设置 DateCreated 和 DateModified 列并在我的应用程序中使用它。但在旧的 SQL 方式中,触发器方式更流行,因为从 DBA 的角度来看更安全。

那么关于哪种方式是最佳实践有什么建议吗?出于应用程序完整性的目的,是否应该在 Entity Framework 中设置它?或者应该使用触发器,因为从数据安全的角度来看它更有意义?或者有没有办法在 Entity Framework 中编写触发器?谢谢。

EF CodeFirst: Rails-style created and modified columns

顺便说一句,尽管这并不重要,但我正在使用 ASP.NET MVC C# 构建这个应用程序。

最佳答案

观点:触发器就像隐藏的行为,除非你去寻找它们,否则你通常不会意识到它们的存在。我还喜欢在使用 EF 时使数据库尽可能保持“哑”状态,因为我使用 EF,所以我的团队不需要维护 SQL 代码。

对于我的解决方案(C# 中的 ASP.NET WebForms 和 MVC 与另一个也包含 DataContext 的项目中的业务逻辑的混合):

我最近遇到了类似的问题,虽然对于我的情况来说更复杂(DatabaseFirst,因此需要自定义 TT 文件),但解决方案基本上是相同的。

我创建了一个界面:

public interface ITrackableEntity
{
DateTime CreatedDateTime { get; set; }
int CreatedUserID { get; set; }
DateTime ModifiedDateTime { get; set; }
int ModifiedUserID { get; set; }
}

然后,我只是在我需要的任何实体上实现了该接口(interface)(因为我的解决方案是 DatabaseFirst,所以我更新了 TT 文件以检查表是否具有这四列,如果有,则将接口(interface)添加到输出中)。

更新:这是我对 TT 文件的更改,其中更新了 EntityClassOpening() 方法:

public string EntityClassOpening(EntityType entity)
{
var trackableEntityPropNames = new string[] { "CreatedUserID", "CreatedDateTime", "ModifiedUserID", "ModifiedDateTime" };
var propNames = entity.Properties.Select(p => p.Name);
var isTrackable = trackableEntityPropNames.All(s => propNames.Contains(s));
var inherits = new List<string>();
if (!String.IsNullOrEmpty(_typeMapper.GetTypeName(entity.BaseType)))
{
inherits.Add(_typeMapper.GetTypeName(entity.BaseType));
}
if (isTrackable)
{
inherits.Add("ITrackableEntity");
}

return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial class {2}{3}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", String.Join(", ", inherits)));
}

剩下的唯一一件事就是将以下内容添加到我的部分 DataContext 类中:

    public override int SaveChanges()
{
// fix trackable entities
var trackables = ChangeTracker.Entries<ITrackableEntity>();

if (trackables != null)
{
// added
foreach (var item in trackables.Where(t => t.State == EntityState.Added))
{
item.Entity.CreatedDateTime = System.DateTime.Now;
item.Entity.CreatedUserID = _userID;
item.Entity.ModifiedDateTime = System.DateTime.Now;
item.Entity.ModifiedUserID = _userID;
}
// modified
foreach (var item in trackables.Where(t => t.State == EntityState.Modified))
{
item.Entity.ModifiedDateTime = System.DateTime.Now;
item.Entity.ModifiedUserID = _userID;
}
}

return base.SaveChanges();
}

请注意,每次创建 DataContext 类时,我都将当前用户 ID 保存在该类的私有(private)字段中。

关于sql-server - DateCreated 或 Modified 列 - Entity Framework 或在 SQL Server 上使用触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16554799/

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