2017-07-28 54 views
0

我使用asp.net樣板與實體框架。 我有2個實體:有多對多關係的產品和供應商。在實體框架中複製記錄多對多關係使用Asp.net Boilerplate

我的問題:當我保存一個產品和一個或多個供應商,產品和保存在supplierProduct表的關係,但供應商記錄被複制在供應商表。

我讀的是因爲有來自不同背景的實體2,所以我需要「附加」的供應商的產品範圍內。我不知道該怎麼做。有人可以幫助我嗎?

我的實體:

public class Product : FullAuditedEntity 
{ 

    public Product() 
    { 
     Suppliers = new HashSet<Supplier>(); 
    } 

    public string Name { get; set; } 

    public virtual ICollection<Supplier> Suppliers { get; set; } 
} 


public class Supplier : FullAuditedEntity 
{ 
    public Supplier() 
    { 
     Products = new HashSet<Product>(); 
    } 

    public string Name { get; set; } 

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

我叫ProductManager域名服務

public async Task<Product> Create(Product entity) 
    { 
     var product = _repositoryProduct.FirstOrDefault(x => x.Id == entity.Id); 

     if (product != null) 
     { 
      throw new UserFriendlyException("Product already exists."); 
     } 
     else 
     { 
      return await _repositoryProduct.InsertAsync(entity); 
     } 
    } 

我叫ProductAppService應用服務:

public async Task Create(CreateProductInput input) 
    { 
     Product output = Mapper.Map<CreateProductInput, Product>(input); 
     await _productManager.Create(output); 
    } 

我CreateProductInput數據傳輸對象

public class CreateProductInput 
{ 
    public string Name { get; set; } 

    public ICollection<Supplier> Suppliers { get; set; } 
} 

我的角度成分的產品列表的組件

// GET Products 
    function getProducts() { 
     productService.listAll() 
      .then(function (result) { 
       vm.users = result.data; 
      }); 
    } 
    getProducts(); 

    // GET Suppliers 
    function getSuppliers() { 
     supplierService.listAll() 
      .then(function (result) { 
       vm.suppliers = result.data; 
      }); 
    } 
    getSuppliers(); 

    //Save the data 
    vm.save = function() { 
     abp.ui.setBusy(); 
     productService.create(vm.product) 
      .then(function() { 
       abp.notify.info(App.localize('SavedSuccessfully')); 
       $uibModalInstance.close(); 
      }).finally(function() { 
       abp.ui.clearBusy(); 
       getProducts(); 
      }); 
    } 
+0

你還沒有包含最相關的方法實現 - 'Product'倉庫的'InsertAsync'。 –

+0

其從asp.net樣板的方法https://github.com/aspnetboilerplate/aspnetboilerplate –

+1

那麼,默認的通用存儲庫實現是相當天真的,顯然不適用於具有相關數據的實體。很可能你需要實現定製存儲庫。 –

回答

0

繼伊萬Stoev評論我弄清楚如何解決它之前獲取它們。我實現了一個自定義存儲庫,並將我的實體附加到dbcontext。

This link顯示詳細介紹瞭如何創建一個自定義庫。

在簡歷:

1-創建自定義儲存庫接口

2-實現自定義儲存庫+

3-創建方法有,使用dbcontext.attach(entity)附加到上下文中的實體這就是正在複製並保存上下文。

4-更換上自定義庫域名服務所使用的IRepository。

5-使用自定義創建的方法,並開心。

這裏的消息如果不夠清楚。

0

我覺得是什麼問題發生在創建方法,你傳遞給它的東西。

public async Task<Product> Create(Product entity) 
{ 
    var product = _repositoryProduct.FirstOrDefault(x => x.Id == entity.Id); 

    if (product != null) 
    { 
     throw new UserFriendlyException("Product already exists."); 
    } 
    else 
    { 
     return await _repositoryProduct.InsertAsync(entity); 
    } 
} 

對我來說,它看起來像參數傳遞給創建方法將總是有編號== 0因此爲什麼它總是會陷入else塊,並插入新的實體

那是因爲CreateProductInput沒有Id屬性來自地圖。所以它總是會映射到Id(int = 0)的默認值的產品。你

還可以通過您的供應商的entites的id和調用創建,這樣,那些應該會自動連接到的DbContext和不重複

+1

嗨用戶,tkx爲答案。我很快就想出瞭如何解決這個問題和病態 –