Asp.net mvc 3 asp.NET MVC 3复合模式模型绑定

Asp.net mvc 3 asp.NET MVC 3复合模式模型绑定,asp.net-mvc-3,ef-code-first,model-binding,composite,Asp.net Mvc 3,Ef Code First,Model Binding,Composite,我的应用程序有产品和供应商,它们在“has a”关系中都有类似的项目……特别是它们有一个“收藏夹”,因此用户可以将它们添加到书签中 因此,我们: public class Product { public int ProductId {get;set;} public int Name {get;set;} public List<Favorite> Favorites {get;set;} } public class Vendor { publi

我的应用程序有产品和供应商,它们在“has a”关系中都有类似的项目……特别是它们有一个“收藏夹”,因此用户可以将它们添加到书签中

因此,我们:

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;}
}
现在我遇到的问题是,我的Vendor.Favorites和Product.Favorites始终为空

如何绑定这些对象,以便可以处理这样的对象?我不把它作为一个单独的实体吗

谢谢

更新:我应该注意,我首先在POCO中使用MVC3代码

更新:解决方案:

我不认为这是理想的,仍然在解决我希望它如何工作的问题,因为它将为添加收藏夹和评论添加冗余代码

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;}
}
公共类产品
{
public int ProductId{get;set;}
公共int名称{get;set;}
公共虚拟列表收藏夹{get;set;}
}
公共类供应商
{
public int VendorId{get;set;}
公共int名称{get;set;}
公共虚拟列表收藏夹{get;set;}
}

在favorites类中使用原始的nullable int变量可以使其正常工作,但是如果我想将favorites类与其他对象一起使用,我必须使用到对象键的新映射来修改favorites属性。出于好奇,在正常处理这些类时,如何管理这些对象的数据存储?我假设您在DAL中处理它?

您可以使用继承,创建一个只包含收藏夹的基类,然后基于该基类派生其他信息的类。这就建立了一种“是”的关系

公共类基类
{
公共列表收藏夹{get;set;}
}
公共类产品:基本类
{
public int ProductID{get;set;}
公共字符串名称{get;set;}
}

然后,产品对象将具有所有3个属性

我会保留一个属性来存储ID(VendorID或ProductId),并使用另一个属性告诉我它是什么类型(
Vendor
Product

对于这些类型,我有一个
Enum

public enum FavoriteType
{
    Vendor, 
    Product
}
并确保在访问子属性之前初始化它们/对它们应用方法,以便它不会引发null引用异常!。你可以自己做

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>();
  }
}
公共类产品
{
public int ProductId{get;set;}
公共int名称{get;set;}
公共列表收藏夹{get;set;}
公共产品()
{
if(收藏夹==null)
收藏夹=新列表();
}
}

基于您使用EF 4.1的假设:

你的模特看起来不错,除非我换衣服

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


那么您的FK关系应该都设置好了。根据我对EF的理解,
列表
旨在建立关系,而不是实际填充。您必须自己填充它,或者在上下文中调用
.Include()
,或者通过引用EF在数据库中创建的实际FK来填充,在您的情况下,FK将是
VendorId\u FavoriteId
ProductId\u FavoriteId

,然后我可以在基类中拥有其他共享的条目,比如评论和注释?我会考虑这个变化。你用过这种款式吗?您是否必须执行任何特殊操作才能将数据放入实体中?是的,您放入基类中的任何内容都可以被任何派生对象利用,就好像它是该对象类的属性一样,它是完全透明和动态的(您可以在类型之间转换并保留公共数据)我在使用两个非常相似的项目时使用了这种风格,这些项目可能只在一个字段中有所不同。例如,在一个工作项目中,我处理的是部件和包,它们除了“packagenumber”/“partnumber”字段外是相同的。除了那些字段外,所有字段都在基类中,然后“packagenumber”/“partnumber”分别在package和part类中。数据库如何区分不同的类?它有单独的表吗?无论我使用可空外键还是鉴别器字段,它仍然不是100%可扩展的,但我同意。因此,我初始化列表,我应该填充它,还是MVC3会为我这样做?我不同意FavoriteType枚举。最喜欢的人不应该知道它的类型。这可能会打破利斯科夫替代原则。检索收藏夹的上下文将决定收藏夹类型。此外,在产品构造函数中,它可以转换为空合并
收藏夹??new List()
我添加了空构造函数并再次尝试使用。我检查了数据库,它在favorites表中的项与products表中的项匹配。当我引用产品的最爱时,它显示0计数。这最终是向后的,但让我找到了正确的位置。我需要int?,这样应用程序就可以有一个原始映射,而不是循环引用(糟糕),我将公共列表更改为公共虚拟列表,每个人都很高兴
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>();
  }
}
    public int? VendorId {get;set;}
    public int? ProductId {get;set;}
    public virtual Vendor VendorId {get;set;}
    public virtual Product ProductId {get;set;}