【发布时间】:2013-05-25 02:05:20
【问题描述】:
我是 Entity Framework 的新手,过去我直接使用 Enterprise Library 或 ADO.NET 将模型映射到数据库表。我使用的一种模式是将出现在每个表中的公共审计字段放在基类中,然后为每个对象继承该基类。
我采取两个步骤来保护两个字段(Created、CreatedBy):
- 在 Base Enitity 上拥有一个私有的无参数构造函数,并创建第二个构造函数,该构造函数需要在创建时传递 Created 和 CreatedBy。
- 将设置器设为私有,以便在创建对象后无法更改值。
基类:
using System;
namespace App.Model
{
[Serializable()]
public abstract class BaseEntity
{
public bool IsActive { get; private set; }
public DateTimeOffset Created { get; private set; }
public string CreatedBy { get; private set; }
public DateTimeOffset LastUpdated { get; protected set; }
public string LastUpdatedBy { get; protected set; }
private BaseEntity() { }
protected BaseEntity(DateTimeOffset created, string createdBy)
{
IsActive = true;
Created = created;
CreatedBy = createdBy;
LastUpdated = created;
LastUpdatedBy = createdBy;
}
}
}
继承类:
using System;
namespace App.Model
{
[Serializable()]
public class Person : BaseEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public Person(DateTimeOffset created, string createdBy) :
base(created, createdBy) { }
}
}
我在这两个方面都遇到了问题。 EF 需要无参数构造函数来创建对象。 EF 不会创建具有私有 setter 的数据库列。
我的问题是是否有更好的方法来实现我的 EF 目标:
- 要求在实例化时填充 Created 和 CreatedBy 的值。
- Created 和 CreatedBy 的值无法更改。
【问题讨论】:
-
还有另一种选择:在您的上下文中覆盖
SaveChanges并在那里执行所有与审计相关的操作(设置新实体的创建日期、设置更新实体的修改日期等)。这一切都将在保存之前完成。 -
我会实现一个接口
IAuditiable,这样你仍然可以拥有不应该被审计的实体,而那些你应该可以在你的 SaveChanges() 调用中实现特定于该接口的逻辑的实体,例如如果那是您想要的,请在以下答案之一中提出建议。 -
@FRoZeN,您不能在接口上使用非公共设置器,这样就达不到我的第二个目标。
标签: c# entity-framework oop entity-framework-5