【问题标题】:NHibernate "error dehydrating property value for..." "object does not match target type"NHibernate“错误脱水属性值......”“对象与目标类型不匹配”
【发布时间】:2014-11-25 22:04:28
【问题描述】:

这是我的设置...

类/接口:

IEntity
User : IEntity
Vehicle : IEntity

我正在使用 Fluent NHibernate 进行设置。

我要做的是为每个实体类保存 Created、Creator、Updated 和 Updater。

我有这些 NHibernate 监听器来完成这个:

public class NHibernateListener : IPreInsertEventListener, IPreUpdateEventListener
{
    private static readonly string CreatedPropertyName = GetPropertyName<IEntity>(val => val.Created);
    private static readonly string CreatorPropertyName = GetPropertyName<IEntity>(val => val.Creator);
    private static readonly string UpdatedPropertyName = GetPropertyName<IEntity>(val => val.Updated);
    private static readonly string UpdaterPropertyName = GetPropertyName<IEntity>(val => val.Updater);

    public bool OnPreInsert(PreInsertEvent @event)
    {
        IEntity entity;
        if ((entity = @event.Entity as IEntity) != null)
        {
            var currentDate = DateTime.Now;
            entity.Created = entity.Updated = currentDate;

            if (User.CurrentUser != null)
            {
                entity.Creator = entity.Updater = User.CurrentUser;
                Set(@event.Persister, @event.State, CreatorPropertyName, currentDate);
                Set(@event.Persister, @event.State, UpdaterPropertyName, currentDate);
            }

            Set(@event.Persister, @event.State, CreatedPropertyName, currentDate);
            Set(@event.Persister, @event.State, UpdatedPropertyName, currentDate);
        }
        return false;
    }

    public bool OnPreUpdate(PreUpdateEvent @event)
    {
        IEntity entity;
        if ((entity = @event.Entity as IEntity) != null)
        {
            var currentDate = DateTime.Now;
            entity.Updated = currentDate;

            if (User.CurrentUser != null)
            {
                entity.Creator = entity.Updater = User.CurrentUser;
                Set(@event.Persister, @event.State, UpdaterPropertyName, currentDate);
            }

            Set(@event.Persister, @event.State, UpdatedPropertyName, currentDate);
        }
        return false;
    }

    private void Set(IEntityPersister persister, object[] state, string propertyName, object value)
    {
        var index = Array.IndexOf(persister.PropertyNames, propertyName);
        if (index == -1)
            return;
        state[index] = value;
    }
    private static string GetPropertyName<TType>(Expression<Func<TType, object>> expression)
    {
        return ExpressionProcessor.FindPropertyExpression(expression.Body);
    }

}

CreatedUpdated 工作正常。 Creator 和 Updater 不工作。

实体

public enum Status
{
    Active,
    Inactive
}

public interface IEntity
{
    Guid Id { get; }
    DateTime Created { get; set; }
    User Creator { get; set; }
    DateTime Updated { get; set; }
    User Updater { get; set; }
    Status Status { get; set; }

}

用户 - 请注意,有一个名为 CurrentUser 的静态 Property,其类型为 User

public class User : IEntity
{
    public static User CurrentUser { get; set; }

    public virtual string Email { get; protected set; }
    public virtual Guid Id { get; protected set; }
    public virtual DateTime Created { get; set; }
    public virtual User Creator { get; set; }
    public virtual DateTime Updated { get; set; }
    public virtual User Updater { get; set; }
    public virtual Status Status { get; set; }
    public virtual string FirstName { get; protected set; }
    public virtual string LastName { get; protected set; }
    public virtual IEnumerable<Vehicle> Vehicles { get; protected set; }

    protected User()
    {            
    }

    public User(Guid id, string email, string firstName, string lastName)
    {
        Id = id;
        FirstName = firstName;
        LastName = lastName;
        Email = email;
    }

    public virtual void AddVehicle(Vehicle vehicle)
    {
        ((IList<Vehicle>) Vehicles).Add(vehicle);
        vehicle.AddUser(this);
    }
}

车辆

public class Vehicle : IEntity
{
    protected Vehicle()
    {
    }

    public Vehicle(Guid id, string make, string model, string color)
    {
        Id = id;
        Make = make;
        Model = model;
        Color = color;
        Users = new List<User>();
    }

    public virtual string Make{ get; set; }
    public virtual string Model{ get; set; }
    public virtual string Color { get; set; }
    public virtual IEnumerable<User> Users { get; protected set; }
    public virtual Guid Id { get; set; }
    public virtual DateTime Created { get; set; }
    public virtual User Creator { get; set; }
    public virtual DateTime Updated { get; set; }
    public virtual User Updater { get; set; }
    public virtual Status Status { get; set; }

    protected internal virtual void AddUser(User user)
    {
        ((IList<User>) Users).Add(user);
    }
}

我正在使用自动映射,这两个类没有覆盖。

当我运行时,当事务尝试提交时出现以下错误:

Message: Error dehydrating property value for MyApp.Domain.Users.User.Creator

Inner Exception: Exception occurred getter of MyApp.Domain.Users.User.Id

Inner Inner Exception: Object does not match target type.

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate


    【解决方案1】:

    这两行在我看来不太好:

            Set(@event.Persister, @event.State, CreatorPropertyName, currentDate);
            Set(@event.Persister, @event.State, UpdaterPropertyName, currentDate);
    

    他们应该在那里吗?

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2014-10-01
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多