【问题标题】:MVC binding products to ordersMVC 将产品绑定到订单
【发布时间】:2016-06-03 12:14:12
【问题描述】:

我在理解 mvc 中的绑定过程时遇到了问题。所以我得到的是 3 个数据库表:Orders、Products、PreOrders。我想为许多订单绑定相同的产品。现在我在 Order 模型中有这样的东西(我会将 Products 作为集合保存在那里):

public virtual ICollection<Products> Product { get; set; }

储蓄是这样的:

List<Products> productList = new List<Products>();
 foreach (int list in preOrderList)
            {
                var order = new Orders()
                {
                    //Product = (from item in )
                };

            var orderResult = _context.PreOrder.Single(o => o.Id == list);
            orderResult.Send = true;

            var productResult = _context.Products.Single(p => p.Id == orderResult.ProductId);
            var newProduct = new Products();
            newProduct.Name = productResult.Name;
            newProduct.Price = productResult.Price;
            productList.Add(newProduct);
            OrderList.Add(orderResult);
        }

        var orders = new Orders()
        {
            Product = productList
        };

        _context.Orders.Add(orders);
        _context.SaveChanges();

使用此代码,我创建了另一个产品,但我需要将产品绑定到此订单,然后将相同的产品添加到另一个订单。有可能吗?

附言

我尝试添加现有产品:

productList.Add(productResult);

但结果我只能为每个产品分配一次。

【问题讨论】:

  • "但是结果我只能为每个产品分配一次。" - 你能详细说明一下吗?
  • 公共虚拟ICollection Product { get;放; } 创建在 Products 模型中分配的虚拟 OrdersId。因此,如果我创建具有相应产品 OrdersId 的订单,然后如果我创建另一个订单,则将其设置为新的 OrdersId。

标签: c# asp.net-mvc entity-framework data-binding


【解决方案1】:

这是一个 EF 问题,而不是 MVC 问题。

您的产品类也需要一个导航器来处理订单,因此它是双向的多对多关系。目前,您有一个从 Orders 到 products 的一对多和一个从 Products 到 Orders 的一对一。

在产品中

public virtual ICollection<Orders> Orders { get; set; }

我假设你拥有的是这样的

public class Orders
{
    [key]
    public int OrderId {get;set;}
    public virtual ICollection<Products> Product { get; set; }
}
public class Product
{
    [key]
    public int ProductId {get;set;}
    [ForeignKey]
    public OrderId {get;set;}//remove this
    public virtual Orders Order {get;set;}//replace with ICollection<Orders>
}

也可以像这样使用流利的

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

modelBuilder.Entity<Orders>()
            .HasMany<Product>(s => s.Products)
            .WithMany(c => c.Orders)
            .Map(cs =>
                    {
                        cs.MapLeftKey("OrderId");
                        cs.MapRightKey("ProductId");
                        cs.ToTable("TABLENAMEFORRELATIONALTABLE");
                    });

}

【讨论】:

  • 这行不通。试过它收到内部服务器错误。
  • 详情?如果先使用代码,您将再次运行迁移。
  • 如果我这样做,我会收到错误消息:条目类型“blah blah”上的导航“产品”尚未添加到模型中,或者被忽略,或者目标实体类型被忽略。产品:public ICollection Product { get;放; }
  • 如果您不关心从产品到订单的导航器,您实际上可以从产品类中完全删除 OrderId 和虚拟订单,它应该可以工作。本文将解释一些方法来做你想做的事。 entityframeworktutorial.net/code-first/…我也更新了一下答案
  • 您使用的是哪个版本的实体框架?如果你在 EF7 上试试这个答案stackoverflow.com/questions/34527336/…
猜你喜欢
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 2019-12-06
  • 1970-01-01
相关资源
最近更新 更多