为什么实体类上的Auditable属性不在数据库中生成列。

时间:2015-02-17 06:28:16

标签: asp.net-mvc entity-framework entity-framework-6 repository-pattern decorator

我是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; }
    }

}

1 个答案:

答案 0 :(得分:3)

那么,看起来你会有一些死代码(或者更确切地说,一些尚未生效的代码):似乎作者在几年前将其作为一个好主意而扼杀了它,并且&#39从那时起就被遗弃在葡萄藤上了。你可以看到他的last commit was almost 1.5 years ago,之前的最后一个几乎是同一时间跨度。

从nuget.org下载的内容不是那么广泛,但是更积极地维护的是我公司在项目中使用的优秀Highway.Data Framework - 它甚至有一个IAuditableInterceptor& #39;完全实现! (警告:希望我可以说我实际使用过这个功能,但框架的其余部分是一流的。)

更好 - 如果你只是学习EF - 从基本的EF6 nuget包开始,并先熟悉它。这样,你就不会再猜测EF是否会弄乱你,或者是一些未实现的第三方库。