2014-11-25 3 views
0

Вот моей установка ...NHibernate «ошибка дегидратации значения свойства для ...» «объект не соответствует целевому типу»

Классов/Интерфейсы:

IEntity 
User : IEntity 
Vehicle : IEntity 

Я использую Fluent NHibernate для настройки.

Что я пытаюсь сделать, это сохранить созданный, созданный, обновленный и обновленный для каждого класса Entity.

У меня есть эти 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); 
    } 

} 

Created и Updated работают отлично. Создатель и Updater не работают.

Классы

IEntity

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

} 

пользователя - Обратите внимание, что статический Property называется CurrentUser, который имеет тип 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. 

ответ

0

Эти две линии не выглядят большими для меня:

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

Должны ли они быть даже там?

Смежные вопросы