使用Fluent NHibernate的Getting Started项目。我试着稍微定制一下这个例子,原因有几个,其中就是消除了json序列化的循环引用。
我所做的是将其Store
和StoreMap
类的引用删回Employee
和Product
类。它现在看起来像这样:
商品/ 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");
}
}
我已将“级联”操作移至Product
和Employee
而非Store
。从我做过的测试来看,HasMany和HasManyToMany协会似乎都工作正常。
我的问题是,这是否是正确的方法。是否会导致我没有预料到的东西。
答案 0 :(得分:0)
据我所知,nHibernate中的标准做法是在模型类中建立关系的两端(实际上,从业务角度来看,它通常是有意义的)。
虽然你不必须这样做(你的例子,我认为,应该可以正常工作)
如果您不想公开一个(或两个)结束,则可以始终将它们定义为私有或受保护。
关于json序列化的p.s:不建议序列化模型实体。这有几个原因,最重要的原因是:
1.您向用户显示的数据可能与您实体中的数据不同(例如,您可能希望向员工显示其姓名,身份证,商店名称和他们拥有的产品数量。这将很难使用你的模型类来做到这一点)
2.很可能你的对象中有未初始化的集合(如果你使用延迟加载)。这些不被序列化。
对于序列化,建议使用DTO。