2013-01-11 46 views
0

在構建將classes映射到數據庫表的object model時,如何指定與其他實體的關係?在對象模型中定義關係的最佳方法?

例子:

Category 
---------------------- 
CategoryId INT  PK 
Name  VARCHAR 
Description VARCHAR 

Product 
---------------------- 
ProductId INT  PK 
CategoryId INT  FK 
Name  VARCHAR 
UnitPrice DECIMAL 
UnitInStock INT 


class Category 
{ 
    public int CategoryId { get; set; } 
    public string Name { get; set; } 
    public List<Product> Products { get; set; } //for navigation only 
} 

class Product 
{ 
    public int ProductId { get; set; } 
    public string Name { get; set; } 
    public decimal UnitPrice { get; set; } 
    public int UnitInStock { get; set; } 
} 

什麼是確定的其他實體的關係的最好方法?

class Product 
{ 
    //... 
    public Category Category; 
} 

class Product 
{ 
    //... 
    public int CategoryId; 
} 

或兩者兼而有之? (一個數據庫綁定(int CategoryId)一個用於導航(Category Category

class Product 
{ 
    //... 
    public int CategoryId; 
    public Category Category; 
} 
+0

您是否使用了一些類似於實體框架的ORM?如果不是,我建議你這樣做。 – mathk

回答

0

這取決於你想要達到的目的。如果你需要backnavigation,加上主類本身作爲一個變量;但如果你不這樣做需要(或者如果你不期望需要)你可以只添加標識符

但是,我認爲你應該選擇其中一種方式並實現它。如果你嘗試使用這兩種方法,可能會導致例如,假設在某些類中,您已將主類添加爲backnavigation屬性;那麼如果在某些情況下不需要,您將做出一些不必要的db查詢,否則將會產生空值我的情況。

1

這實際上取決於您的模型在關係方面需要什麼。通過將Category引用到您的Product中,您將在模型級創建雙向關係。從數據完整性的角度來看,這在數據庫層面可能是必要的,但這並不意味着您的模型必須效仿,這樣做並不總是合情合理的。

在我看來,Product不應該知道任何關於Category,因爲它沒有必要。 A Product可以自己存在,而不與Category相關聯。但是,如果你覺得Product應該知道這是Category然後通過各種手段增加的性質的研究。

Id屬性VS導航屬性

這又取決於你的要求是什麼。通常情況下,使用導航屬性的前景會更好,因爲ID屬性會作爲該屬性的一部分而降低。然而,當你真正需要的是ID時,你可能會增加額外的開銷來拉低整個對象。

+0

「在我看來,產品不應該知道類別的任何內容,因爲它不需要」。如果您使用存儲庫,那麼在向產品存儲庫添加新產品時,如何指定它屬於哪個類別? – tigrou

+0

@tigrou這是您必須制定的實施細節。但是,通常您會將產品添加到該特定類別 - 您不會將產品*添加到*類別。使用您當前的設置,您需要有一個類別,然後才能添加對我無意義的產品。 – James

0

我可以告訴你folowing代碼。我用它來保持實體之間的關係(從數據庫即消費者,書籍的數據實例的對象represtentation)。它允許在第一次參考相關對象時讀取內容。

public class EntityHandler<T, V> 
     where T : Entity<V>, new() 
     where V : DataObject 
    { 
     private long myDataObjectID; 
     private T myEntityObject; 
     public delegate Entity<V> GetEntityObject(long oid); 

     private GetEntityObject GetEntityObjectFunction; 

     private Entity<V> HandledEntity 
     { 
      set 
      { 
       if (myEntityObject == null) 
       { 
        myEntityObject = (T)value; 
       } 
      } 
      get { return myEntityObject; } 
     } 

     public EntityHandler(GetEntityObject extCntrGetBO, long oid) 
     { 
      myDataObjectID = oid; 
      GetEntityObjectFunction = extCntrGetBO; 
     } 

     public T o 
     { 
      get 
      { 
       if (myEntityObject == null) 
       { 
        myEntityObject = (T)GetEntityObjectFunction(myDataObjectID); 
       } 
       return myEntityObject; 
      } 
     } 

     public long ID 
     { 
      get { return myDataObjectID; } 
      set 
      { 
       myDataObjectID = value; 
       myEntityObject = null; 
      } 
     } 
    } 
相關問題