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是推薦的方法。