c#-在实体框架中实现“通用”机制来处理时间数据
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-在实体框架中实现“通用”机制来处理时间数据,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2199字,纯文字阅读大概需要4分钟。
内容图文
![c#-在实体框架中实现“通用”机制来处理时间数据](/upload/InfoBanner/zyjiaocheng/665/66d5b00f5c0447b997e5b5c962661605.jpg)
我正在尝试使用实体框架来实现一种“通用”机制来更新SQL Server数据库中的时态数据.
我所做的是创建一个名为ITemporalData的“标记”接口,该接口定义了需要存在的两个属性-DateTime ValidFrom和DateTime?有效.
public interface ITemporalData
{
DateTime ValidFrom { get; set; }
DateTime? ValidTo { get; set; }
}
我希望在我的DbContext.SaveChanges()重写中实现“通用”方法以:
>克隆任何ITemporalData对象,这将为我提供一个要存储的新对象(EntityState.Added),并将其ValidFrom值设置为当前日期和时间
>将原始的修改后的条目重置为其数据库值(在实体上调用.Reset()),然后将该“旧”记录的ValidTo设置为当前日期和时间
尽管我可以轻松地在SaveChanges()重写中过滤掉修改后的ITemporalData对象,如下所示:
public partial class MyDbContext
{
// override the "SaveChanges" method
public override int SaveChanges()
{
DateTime currentDateTime = DateTime.Now;
// get the modified entities that implement the ITemporalData interface
IEnumerable<DbEntityEntry<ITemporalData>> temporalEntities = ChangeTracker.Entries<ITemporalData>().Where(e => e.State == EntityState.Modified);
foreach (var temporalEntity in temporalEntities)
{
// how would I do that, really? I only have an interface - can't clone an interface......
var cloned = temporalEntity.Entity.Clone();
// and once it's cloned, I would need to add the new record to the correct DbSet<T> to store it
// set the "old" records "ValidTo" property to the current date&time
temporalEntity.Entity.ValidTo = currentDateTime;
}
return base.SaveChanges();
}
}
我正在努力使用“克隆修改后的记录”方法-实际上,我只有一个ITemporalData接口-但克隆(使用AutoMapper或其他方法)始终取决于实际的基础具体数据类型.
解决方法:
要克隆实体,您可能只是通过反射(Activator.CreateInstance)创建新实例,然后通过反射将所有原始(非导航)属性复制到该实例.最好不要为此使用自动映射器工具,因为它们也会访问导航属性,这可能会导致延迟加载(或至少确保禁用了延迟加载).
如果您不喜欢反射(请注意,自动映射器仍然会使用它),您还可以从IClo??neable继承您的接口,并为每个ITemporalData实体实现Clone方法(如果您的实体是自动生成的,请使用部分类).然后,每个实体自行决定如何克隆,而无需进行任何反思.如果您的克隆逻辑很复杂(例如,涉及从导航属性克隆相关对象),这种方法也有好处.
若要添加实体以更正DbSet,请使用DbContext的无类型Set方法:
this.Set(temporalEntity.GetType()).Add(temporalEntity);
内容总结
以上是互联网集市为您收集整理的c#-在实体框架中实现“通用”机制来处理时间数据全部内容,希望文章能够帮你解决c#-在实体框架中实现“通用”机制来处理时间数据所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。