我是Entity框架和Repository模式的新手。我正在尝试实现Repository Decorator模式,它基本上包含Auditable和Archivable类,并扩展了Attribute类。但是当我将它们添加到任何实体类时:
[Auditable]
public class Student{
public int Id;
public string Name;
}
使用实体框架代码第一种方法,实体'Student'应该从IAuditable接口生成列Id,Name和CreatedBy,Created,UpdatedBy和Updated列。但它产生的只是列Id和Name。 那么使用实体框架实现Repository Decorator模式的正确方法是什么,以及如何在实体类上应用Auditable属性。?
这里我提供链接以了解存储库装饰模式。
https://efpatterns.codeplex.com/discussions/282699
https://efpatterns.codeplex.com/
这是AuditableAttribute类,扩展了Attribute:
using System;
namespace EntityFramework.Patterns.Extensions
{
public class AuditableAttribute : Attribute { }
}
Generic AuditableRepository类:
using System;
using System.Threading;
using EntityFramework.Patterns.Extensions;
namespace EntityFramework.Patterns.Decorators
{
public class AuditableRepository<T> : RepositoryDecoratorBase<T>
where T : class
{
public AuditableRepository(IRepository<T> surrogate) : base(surrogate) {
}
public override void Insert(T entity)
{
IAuditable auditable = entity as IAuditable;
if (auditable != null)
{
auditable.CreatedBy = Thread.CurrentPrincipal.Identity.Name;
auditable.Created = DateTime.Now;
}
base.Insert(entity);
}
public override void Update(T entity)
{
IAuditable auditable = entity as IAuditable;
if (auditable != null)
{
auditable.UpdatedBy = Thread.CurrentPrincipal.Identity.Name;
auditable.Updated = DateTime.Now;
}
base.Update(entity);
}
}
}
这是界面。
using System;
namespace EntityFramework.Patterns.Extensions
{
public interface IAuditable
{
string CreatedBy { get; set; }
DateTime? Created { get; set; }
string UpdatedBy { get; set; }
DateTime? Updated { get; set; }
}
}
答案 0 :(得分:3)
那么,看起来你会有一些死代码(或者更确切地说,一些尚未生效的代码):似乎作者在几年前将其作为一个好主意而扼杀了它,并且&#39从那时起就被遗弃在葡萄藤上了。你可以看到他的last commit was almost 1.5 years ago,之前的最后一个几乎是同一时间跨度。
从nuget.org下载的内容不是那么广泛,但是更积极地维护的是我公司在项目中使用的优秀Highway.Data Framework - 它甚至有一个IAuditableInterceptor
& #39;完全实现! (警告:希望我可以说我实际使用过这个功能,但框架的其余部分是一流的。)
更好 - 如果你只是学习EF - 从基本的EF6 nuget包开始,并先熟悉它。这样,你就不会再猜测EF是否会弄乱你,或者是一些未实现的第三方库。