使用Asp.net Boilerplate

时间:2017-07-28 17:08:52

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

我正在使用带有实体框架的asp.net样板文件。 我有两个实体:产品和供应商有很多关系。

我的问题:当我与一个或多个供应商保存产品时,产品和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; }
}

我的角度组件product-list-component

    // 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();
            });
    }

2 个答案:

答案 0 :(得分: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);
    }
}

对我来说,看起来你传递给Create方法的参数总是会有Id == 0因此为什么它总会落入else块并插入新的实体

这是因为CreateProductInput没有要映射的Id属性。所以它总是映射到具有Id(int = 0)的默认值的产品。

此外,您可以在调用Create之前传递您的Supplier entites的id并获取它们,这样那些应该自动附加到DbContext而不是重复

答案 1 :(得分:0)

根据Ivan Stoev的评论,我弄清楚如何解决它。我实现了一个自定义存储库,并将我的实体附加到那里的dbcontext。

This link详细说明了如何创建自定义存储库。

简历中:

1-创建自定义存储库INTERFACE

2-实现自定义存储库+

3-在那里创建一个方法并使用dbcontext.attach(entity)将正在复制的实体附加到上下文并保存上下文。

4-替换自定义存储库的域服务上使用的IRepository。

5-使用自定义创建的方法并感到高兴。

如果它不够清楚,请点击此处。