2017-02-21 86 views
1
public class Product : EntityBase<Product, int>, IAggregateRoot 
{ 
    public virtual string ProductName { get; set; } 
    public virtual List<ProductDetail> Description { get; set; } 
} 

public class ProductDetail : EntityBase<ProductDetail, int>, IAggregateRoot 
{ 
    public virtual string Description { get; set; } 
    public virtual Product Product { get; set; } 
} 

Вышеупомянутый продукт имеет несколько ProductDetails. Мое отображение приведено ниже;NHibernate От одного до многих картирование и сохранение

public class ProductMap : ClassMapping<Product> 
{ 
    public ProductMap() 
    { 
     Lazy(false); 
     Table("Product"); 

     Id(x => x.ID, map => { map.Column("ID"); map.Generator(Generators.Native); }); 
     Property(x => x.ProductName, map => map.NotNullable(true)); 

     Bag(x => x.Description, m => { 
      m.Inverse(true); // Is collection inverse? 
      m.Cascade(Cascade.All); //set cascade strategy 
      m.Key(k => k.Column(col => col.Name("ProductID"))); //foreign key in Detail table 
     }, a => a.OneToMany()); 
    } 
} 

public class ProductDetailMap : ClassMapping<ProductDetail> 
{ 
    public ProductDetailMap() 
    { 
     Lazy(false); 
     Table("ProductDetail"); 

     Id(x => x.ID, map => { map.Column("ID"); map.Generator(Generators.Native); }); 
     Property(x => x.Description, map => map.NotNullable(false)); 

     ManyToOne(x => x.Product, x => 
     { 
      x.Column("ProductID"); 
     }); 
    } 
} 

Когда я сохраню это; Iam становится ниже ошибки.

Исключение типа «NHibernate.PropertyAccessException» произошло в NHibernate.dll, но не был обработан в пользовательском коде Дополнительная информация: Invalid Cast (проверить ваше отображение для несовпадения типа недвижимости);

ответ

1

Для коллекций отображения, мы должны использовать интерфейсы (IList<>)

public class Product : EntityBase<Product, int>, IAggregateRoot 
{ 
    public virtual string ProductName { get; set; } 
    //public virtual List<ProductDetail> Description { get; set; } 
    public virtual IList<ProductDetail> Description { get; set; } 
} 

NHibernate будет вводить свою собственную IList<> реализации - который не является дочерним List ... Это нужно для прокси ... ленивая загрузка