2012-08-01 65 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