2012-08-01 91 views
3

我的應用程序有產品和供應商,他們都有類似的項目在一個「有」關係...特別是他們有一個「最喜歡的」,所以用戶可以書籤他們。asp.NET MVC 3複合模式模型綁定

所以我們有:

public class Product 
{ 
    public int ProductId {get;set;} 
    public int Name {get;set;} 
    public List<Favorite> Favorites {get;set;} 
} 

public class Vendor 
{ 
    public int VendorId {get;set;} 
    public int Name {get;set;} 
    public List<Favorite> Favorites {get;set;} 
} 

public class Favorite 
{ 
    public int FavoriteId {get;set;} 
    public string UserName {get;set;} 
} 

起初,這沒有工作,所以我說:

public int? VendorId {get;set;} 
    public int? ProductId {get;set;} 

現在我遇到的問題是,我Vendor.Favorites和產品。收藏夾始終爲空。

如何綁定這些以便我可以使用類似的對象?我是不是把它做成一個獨立的實體?

謝謝!

更新:我應該注意到,我使用MVC 3 Code-first與POCO。

UPDATE:解決方法:

我不認爲這是理想的,仍在制定的扭結與我多麼希望這工作,因爲它會添加收藏夾和評論添加冗餘代碼。

public class Product 
{ 
    public int ProductId {get;set;} 
    public int Name {get;set;} 
    public virtual List<Favorite> Favorites {get;set;} 
} 

public class Vendor 
{ 
    public int VendorId {get;set;} 
    public int Name {get;set;} 
    public virtual List<Favorite> Favorites {get;set;} 
} 

有在收藏類使得它的工作原可空int變量,但如果我想使用與其他物體的收藏類我將不得不修改與新的映射收藏夾屬性的關鍵物體。出於好奇,在正常處理這些類時,如何管理這些對象的數據存儲?我假設你在DAL處理它?

回答

0

基於你使用EF 4的假設。1:

你的模型看起來相當不錯,除了我會改變

public int? VendorId {get;set;} 
    public int? ProductId {get;set;} 

public virtual Vendor VendorId {get;set;} 
    public virtual Product ProductId {get;set;} 

那麼你的FK關係應該所有設置。根據我對EF的理解,List<Favorite>意在建立一種關係,而不是實際上人口稠密。你必須自己來填充它,通過調用上下文.Include()或引用實際FK英孚在數據庫中創建而你的情況是VendorId_FavoriteIdProductId_FavoriteId

+0

這最終倒退了,但讓我在正確的地方。我需要int?的,以便應用程序可以有一個原始映射,沒有循環引用(可怕),我將公共列表更改爲公共虛擬列表,並且每個人都很高興 – Snowburnt 2012-08-01 20:47:47

1

您可以使用繼承,使基類只包含Favorite,然後根據其他信息派生類。這建立了「是一個」關係

Ex。

public class baseClass 
{ 
public list<Favorite> Favorites { get; set;} 
} 
public class Product : base 
{ 
public int ProductID { get; set; } 
public string Name { get; set; } 
} 

然後產品對象將具有所有3個屬性。

+0

,然後我可以有其他共享件類似的評論和基類中的註釋?我會考慮這個改變。你有沒有使用過這種風格?你是否需要做任何特別的事情才能將數據導入實體? – Snowburnt 2012-08-01 19:29:39

+0

是的,你放入基類中的任何東西都可以被任何派生對象使用,就好像它是該對象類的屬性一樣,它是完全透明的,並且是動態的(可以在類型之間轉換並保留公共數據)。使用這種風格時,使用2個非常相似的項目,可能只在一個領域有所不同。例如,在工作中的一個項目中,我處理零件和包裝,除了「包裝編號」/「零件編號」字段外,它們是相同的。除了那些以外的所有字段都在基類中,然後「packagenumber」/「partnumber」分別進入包和部分類。 – 2012-08-01 19:35:28

+0

數據庫如何區分不同的類?它有單獨的表嗎? – Snowburnt 2012-08-02 17:32:55

0

我會保持一個屬性來存儲的ID(無論是廠商ID或產品編號),並使用其他屬性來告訴我它是什麼類型(VendorProduct

public class Favorite 
{ 
    public int FavoriteId {get;set;} 
    public string UserName {get;set;} 
    public int ItemID { set;get;} //can use a better generic name 
    public FavoriteType Type { set;get;} 
} 

我對類型

Enum
public enum FavoriteType 
{ 
    Vendor, 
    Product 
} 

並確保您在訪問它們之前初始化您的子屬性/對這些屬性應用一個方法,以便它不會拋出空引用異常!你可以做它的構造函數本身

public class Product 
{ 
    public int ProductId {get;set;} 
    public int Name {get;set;} 
    public List<Favorite> Favorites {get;set;} 

    public Product() 
    { 
     if(Favourites==null) 
      Favorites=new List<Favorite>(); 
    } 
} 
+0

我是否可以使用可空的外鍵或鑑別器字段,它仍然不是100%可擴展的,但我對此沒問題。所以我初始化這個列表,是否需要填充它,或者MVC3會爲我做? – Snowburnt 2012-08-01 19:31:20

+0

我不同意FavoriteType枚舉。收藏不應該知道它的類型。這可能會打破Liskov替代原則。獲取收藏夾的上下文將確定最喜歡的類型。也可以在Product構造函數中將它轉換爲null coalesce'Favorites?新列表()' – 2012-08-01 19:39:05

+0

我添加了null構造函數並再次嘗試使用。我檢查了數據庫,它在收藏夾表中有與產品表中的項目相匹配的項目。當我參考產品的最愛時,它說0計數。 – Snowburnt 2012-08-01 20:26:19