0

玩弄流利NHibernate的Getting Started项目。我试着自定义这个例子,原因有几个,其中包括消除了json序列化的循环引用。NHibernate单向关联

我所做的是将StoreStoreMap类的参考文献还原为EmployeeProduct类。现在看起来是这样的:

店/ StoreMap

public class Store 
{ 
    public virtual int Id { get; private set; } 
    public virtual string Name { get; set; } 
} 
public StoreMap() 
{ 
    Id(x => x.Id); 
    Map(x => x.Name); 
} 

公司雇员/ EmployeeMap的

public class Employee 
{ 
    public virtual int Id { get; private set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual Store Store { get; set; } 
} 

public class EmployeeMap : ClassMap<Employee> 
{ 
    public EmployeeMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.FirstName); 
    Map(x => x.LastName); 
    References(x => x.Store).Cascade.All(); 
    } 
} 

产品/ ProductMap

public class Product 
{ 
    public virtual int Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual double Price { get; set; } 
    public virtual IList<Store> StoresStockedIn { get; private set; } 

    public Product() 
    { 
    StoresStockedIn = new List<Store>(); 
    } 

    public virtual void StockAt(Store store) 
    { 
    StoresStockedIn.Add(store); 
    } 
} 

public class ProductMap : ClassMap<Product> 
{ 
    public ProductMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Name); 
    Map(x => x.Price); 
    HasManyToMany(x => x.StoresStockedIn) 
     .Cascade.All() 
     .Table("StoreProduct"); 
    } 
} 

我已将“Cascade”操作移至ProductEmployee而不是Store。从我做的测试中,HasMany和HasManyToMany协会似乎都能正常工作。

我的问题是,如果这是正确的做法。是否会导致我没有预料到的事情。

回答

0

据我所知,在模型类中实现关系的两端(实际上,从商业的角度来看,它通常是有意义的)在nHibernate中是标准做法。
虽然你不必须做到这一点(你的例子,我认为,应该工作得很好)。
如果你不想公开一个(或两个)端,你总是可以将它们定义为私有或受保护的。

p.s关于json序列化:不建议序列化模型实体。这是由于几个原因,最重要的是:
1.您向用户显示的数据可能与您在实体中显示的数据不同(例如,您可能想向员工展示他们的姓名,ID,他们的商店名称和他们拥有的产品数量,使用模型类很难做到这一点)。
2.很有可能您的对象中有未初始化的集合(如果您使用延迟加载)。这些做不是得到序列化。

对于序列化,DTO是推荐的方法。