2016-10-08 32 views
0

我仍然在學習使用MVC的實體框架並嘗試創建一個通用購物網站。我有模型 - 具有一對多關係的類別和產品(例如:產品「IPhone7」將屬於類別「電子」)See Models edmx diagram hereEntity Framework在SaveChanges()上添加不必要的記錄()

問題是每當我添加一個新產品,比如P,屬於類別C中,即使C在類別表中已存在,EF也會自動將新條目C添加到類別表中。我相信問題是EF處理一對多關係的方式。我也嘗試在Category類的categoryName中添加[Index(IsUnique = true)],但它沒有幫助。每次添加產品時,我都不希望EF添加新類別。

下面是我的控制器,視圖,數據層和業務層的代碼片段。

//Controller 
    public ActionResult SaveCategory(Category c) 
    { 
     AdminBusinessLayer adminBL = new AdminBusinessLayer(); 
     adminBL.AddCategory(c); 
     return RedirectToAction("Index"); 
    } 

    public ActionResult SaveProduct(Product p, string btnSubmit, string dpdCategories) 
    { 
     AdminBusinessLayer adminBL = new AdminBusinessLayer(); 
     Category productCategory = new Category(); 
     List<Category> categoryList = new List<Category>(); 
     categoryList = adminBL.ShowCategory(); 
     foreach (Category c in categoryList) 
     { 
      if (c.CategoryName == dpdCategories) 
       productCategory = c; 
     } 
     p.category = productCategory; 
     p.CategoryId = productCategory.Id; 
     adminBL.AddProduct(p); 
     return RedirectToAction("Index"); 
    } 

@{ 
 
    ViewBag.Title = "Admin Functions"; 
 
} 
 

 
@using Flipkart.ViewModels 
 
@using Flipkart.Models 
 
@model AdminViewModel 
 

 
<form action="/Admin/SaveCategory" method="post"> 
 
    <h2>Add New Category</h2> 
 
    Name: <input type="text" id="txtCategoryName" name="CategoryName" /> 
 
    <br /> 
 
    <br /> 
 
    <input type="submit" name="btnAddCategory" value="Add Category" /> 
 
    <br /> 
 
    <br /> 
 
    <h2>Existing Categories</h2> 
 
    <table border="1" cellpadding="5" width="20"> 
 
     <tr style="background-color:yellowgreen"> 
 
      <th>Id</th> 
 
      <th>Category</th> 
 
     </tr> 
 
     @foreach (Category c in Model.categoryList) 
 
     { 
 
      <tr> 
 
       <td>@c.Id</td> 
 
       <td>@c.CategoryName</td> 
 
      </tr> 
 
     } 
 
    </table> 
 
</form> 
 
<br /> 
 
<br /> 
 
<br /> 
 
<br /> 
 
<form action="/Admin/SaveProduct" method="post"> 
 
    <h2>Add New Product</h2> 
 
    Name: <input type="text" id="txtProductName" name="ProductName" /> 
 
    Category: @Html.DropDownList("dpdCategories",new SelectList(Model.categoryNames,Model)) 
 
    Price: @Html.TextBox("Price") 
 
    <br /> 
 
    <br /> 
 
    <input type="submit" name="btnAddProduct" value="Add Product" /> 
 
    <br /> 
 
    <br /> 
 
    <br /> 
 
    <br /> 
 
    <h2>Existing Products</h2> 
 
    <table border="1" cellpadding="5" width="20"> 
 
     <tr style="background-color:yellowgreen"> 
 
      <th>Id</th> 
 
      <th>Product</th> 
 
     </tr> 
 
     @foreach (Product p in Model.productList) 
 
     { 
 
      <tr> 
 
       <td>@p.Id</td> 
 
       <td>@p.ProductName</td> 
 
      </tr> 
 
     } 
 
    </table> 
 
</form>

//Data Layer 
public class FlipkartContext:DbContext 
{ 
    public FlipkartContext() : base("Flipkart") 
    { 
    } 
    public DbSet<Category> Category { get; set; } 
    public DbSet<Product> Product { get; set; } 
    public DbSet<Cart> cart { get; set; } 
} 

下面是將數據保存到數據庫中的業務層:

//Business Layer 
    public void AddCategory(Category c) 
    { 
     FlipkartContext flipkartDBContext = new FlipkartContext(); 
     flipkartDBContext.Category.Add(c); 
     flipkartDBContext.SaveChanges(); 
    } 

    public List<Category> ShowCategory() 
    { 
     List<Category> categoryList = new List<Category>(); 
     FlipkartContext flipkartDBContext = new FlipkartContext(); 
     categoryList = flipkartDBContext.Category.ToList(); 
     return categoryList; 
    } 
    public void AddProduct(Product p) 
    { 
     FlipkartContext flipkartDBContext = new FlipkartContext(); 
     flipkartDBContext.Product.Add(p); 
     flipkartDBContext.SaveChanges(); 
    } 

    public List<Product> ShowProduct() 
    { 
     List<Product> productList = new List<Product>(); 
     FlipkartContext flipkartDBContext = new FlipkartContext(); 
     productList = flipkartDBContext.Product.ToList(); 
     return productList; 
    } 
+0

您是否也可以添加產品類別代碼? – Sefa

回答

1

的問題是,在你的經營業務,你居然層的每個請求創建EF的新上下文。這意味着當您通過ShowCategory方法獲取數據時,方法EF不會跟蹤返回的Category對象的更改方法。

通常,EF上下文爲整個請求共享給服務器。 如果您只使用一個上下文類別將不會被複制。

你應該只是把私人領域進入你的經營業務層類

private FlipkartContext _flipkartDBContext; 

,並在該類

_flipkartDBContext = new FlipkartContext(); 

的構造函數初始化它,然後你可以使用,在整個它的一個實例類

+0

謝謝@jgasiorowski。這是確切的問題。我相信你提到的方法應該是理想的做法。太糟糕的培訓不包括這:(:(。再次感謝您的快速幫助!! – ishanmeh

+0

@ishanmeh這不是在解決方案如何接近它的確切方式Usualy人使用Dependecy Injection爲此,無疑你應該看看關於這個話題,這是常用的,我相信它也會對你未來的項目有所幫助;) – jgasiorowski

相關問題