流畅的NHibernate装饰实体

时间:2012-06-08 19:50:11

标签: c# fluent-nhibernate poco

使用POCO和Fluent NHibernate,我希望能够获取像User这样的对象,并能够为其提供各种属性。我希望这些对象能够专注于它们的属性,而不是常见的属性。目前,我有一个可以派生的AuditableEntity,让我的实体能够拥有像CreatedDateTime和ModifiedDateTime这样的Audited属性,但我也希望能够为每个对象实现我的Id的实现,Id应该能够成为其他一些基础对象的一部分,所以我可以说这个对象有一个Guid Id,这个有一个int id,而且这个没有Id。目前,我的User对象如下所示:

User.cs

namespace ZeroBase.Domain.Entities
{
public class User : AuditableEntity<User>
{
    public virtual Guid Id { get; set; }
    public virtual string Username { get; set; }
    public virtual string Password { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string EmailAddress { get; set; }
    public virtual IEnumerable<Comment> Comments { get; set; }
}
}

我的UserMap如下所示:

UserMap.cs

namespace ZeroBase.Infrastructure.Data
{
public class UserMap : AuditMap<User>
{
    public UserMap()
    {
        Id(x => x.Id)
            .Column("Id")
            .GeneratedBy.Guid();
        Map(x => x.Username);
        Map(x => x.Password);
        Map(x => x.FirstName);
        Map(x => x.LastName);
        Map(x => x.EmailAddress);
        HasMany(x => x.Comments);
        Table("Users");
    }
}
}

有没有在某种通用基类中处理Id创建,并且仍然有一个单独的类,对象可以从中继承以成为可审计的?

1 个答案:

答案 0 :(得分:2)

您是否在没有ID的课程中使用AuditableEntityEntity表示该类具有标识。基于此,我想说你可以向AuditableEntity添加Id属性。

如果你将它用于没有身份的类,比如值对象,我会创建另一个基类。这样的事情会有意义吗?

class Entity {
    Guid Id { get; set; } 

    public Entity() {
        Id = Guid.NewGuid();
    }
}

interface IAuditable<T> {
    DateTime CreatedAt {get; set; }
    // ...
}

class AuditableEntity<T> : Entity, IAuditable<T> {
    DateTime CreatedAt { get; set; }
}

class AuditableValueObject<T> : IAuditable<T> {
    DateTime CreatedAt { get; set; }
}

// Class that has both an identity and is auditable
class User : AuditableEntity<User> {
    // ..
}

// Class without an identity but auditable
class Money : AuditableValueObject<Money> {
    // ..
}

// Class with an identity but not auditable
class Customer : Entity {
    // ..
}

注意:实体,价值对象等是Domain Driven Design(DDD)的条款。