1 回答

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的方法期望返回一個(gè) IEnumerable,但您只返回傳入的單個(gè) Product DTO。
簽名應(yīng)該是:
public async Task<ProductDTO> AddProducts(ProductDTO ProductDTO, List<ParameterDTO> ParameterDTO)
鑒于 ProductDTO 具有 ParameterDTO 的集合,是否還需要第二個(gè)參數(shù)?(看起來(lái)它會(huì)發(fā)送兩次參數(shù))
根據(jù)您的實(shí)體定義,我發(fā)現(xiàn)了一些問(wèn)題:
[ForeignKey("ProductTypeId")]
public int ProductTypeId { get; set; }
public virtual ProductType ProductType { get; set; }
應(yīng)該
[ForeignKey("ProductType")] // FK to the reference property.
public int ProductTypeId { get; set; }
public virtual ProductType ProductType { get; set; }
所有導(dǎo)航屬性(例如集合和產(chǎn)品類(lèi)型)都應(yīng)聲明為虛擬的,否則您將獲得不一致的行為。如果需要,聲明為虛擬的將可以訪問(wèn)延遲加載,其他將保留為#null。
Product 和 Parameter 都不應(yīng)該引用 ProductType,據(jù)我所知,它可能應(yīng)該只引用 Product 以避免非規(guī)范化問(wèn)題。(具有不同 ProductTypes 集的參數(shù)的產(chǎn)品。)
在處理導(dǎo)航屬性時(shí),我建議從實(shí)體中刪除 FK 屬性并使用映射 (EF6)/陰影屬性。(英孚核心)
例如:
public class ProductParameter
{
public int Id { get; set; }
public virtual Product Product { get; set; } // No ProductId/ParameterId
public virtual Parameter Parameter { get; set; }
public string Value { get; set; }
}
modelBuilder.Entity<Product>()
.HasMany(x => x.ProductParameters)
.WithOne(x => x.Product)
.HasForeignKey("ProductId"); // Sets up a shadow property.
映射 FK 的問(wèn)題在于有 2 個(gè)真實(shí)來(lái)源供參考。ProductParameter.ProductId 與 ProductParameter.Product.Id。通常這些將指向相同的值,但代碼可能依賴于一條路徑而不是另一條路徑,如果只更改一條路徑而不更改另一條路徑,則會(huì)導(dǎo)致一致性錯(cuò)誤。
謹(jǐn)慎使用異步操作。如果您通過(guò) ID 或任何其他相對(duì)快速的操作拉回單個(gè)記錄,請(qǐng)不要使用異步,因?yàn)樽?cè)延續(xù)會(huì)產(chǎn)生性能成本。(更快地進(jìn)行同步調(diào)用)異步適用于預(yù)計(jì)需要一段時(shí)間的操作。(即超過(guò)一秒)
最后,該代碼可能有效,但它沒(méi)有很好地利用 EF,單獨(dú)設(shè)置所有這些實(shí)體,并且您通常不希望多次調(diào)用 SaveChanges 以確保數(shù)據(jù)一起提交或根本不提交(如果有)問(wèn)題。
var EntryProduct = _context.Products.Find(ProductDTO.ProductId);
if (EntryProduct != null)
return ProductDTO;
var product = new Product
{
Id = ProductDTO.ProductId,
Number = ProductDTO.Number,
Amount = ProductDTO.Amount,
PrimeCostEUR = ProductDTO.PrimeCostEUR,
};
var parameterIds = ParameterDTO.Select(x => x.Id).ToList();
var parametersToAdd = context.Parameters
.Where(x => parameterIds.Contains(x.ParameterId))
.Select(x => new ProductParameter
{
Product = product,
Parameter = x
}).ToList();
product.ProductParameters.AddRange(parametersToAdd);
await _context.SaveChangesAsync();
return ProductDTO;
我不建議為 DbContext (_context) 使用模塊級(jí)變量,因?yàn)樯舷挛膽?yīng)該是短暫的,以幫助避免一個(gè)工作流打算保存而其他代碼可能不會(huì)保存的潛在問(wèn)題。如果它由 IoC 容器注入并限定為與請(qǐng)求匹配的生命周期,那么這應(yīng)該不會(huì)導(dǎo)致任何問(wèn)題。請(qǐng)注意上下文打開(kāi)的時(shí)間超過(guò)需要的時(shí)間。
- 1 回答
- 0 關(guān)注
- 143 瀏覽
添加回答
舉報(bào)