我正在使用带有实体框架的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();
});
}
答案 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-使用自定义创建的方法并感到高兴。
如果它不够清楚,请点击此处。