第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在EF Core中實(shí)現(xiàn)添加相關(guān)數(shù)據(jù)的方法?

如何在EF Core中實(shí)現(xiàn)添加相關(guān)數(shù)據(jù)的方法?

C#
慕桂英546537 2022-11-21 16:02:08
如何實(shí)現(xiàn)添加相關(guān)數(shù)據(jù)的方法EF core?需要將哪些對(duì)象提交給 add 方法,它應(yīng)該返回什么?我需要在數(shù)據(jù)庫(kù)中添加相關(guān)數(shù)據(jù),例如: {        "productId": 0,        "number": "xxx",        "amount": 5.65,        "primeCost": 20.33,        "productTypeId": 0,        "parameters": [            {                "id": 0,                "name": "Type",                "value": null            },            {                "id": 3,                "name": "steel grade",                "value": "CK45"            },            {                "id": 4,                "name": "diameter",                "value": "40"            }        ]    }這些是我的模型類(lèi):public class Product //: BaseObject{    public int Id { get; set; }    public string Name { get; set; }    public string Number { get; set; }    public double Amount { get; set; }    public double PrimeCost { get; set; }    [ForeignKey("ProductTypeId")]    public int  ProductTypeId {  get; set; }    public virtual ProductType ProductType { get; set; }    public ICollection<ProductParameter> ProductParameters { get; set; } = new List<ProductParameter>();}public class ProductType //: BaseObject{       public int Id { get; set; }    public string NameType { get; set; }    public ICollection<Parameter> Parameters { get; set; } = new List<Parameter>();    public ICollection<Product> Products { get; set; } = new List<Product>();} public class Parameter //: BaseObject{    public int Id { get; set; }    public string Name { get; set; }    [ForeignKey("ProductTypeId")]    public int ProductTypeId { get; set; }    public ProductType ProductType { get; set; }    public ICollection<ProductParameter> ProductParameters { get; set; } = new List<ProductParameter>();} public class ProductParameter //: BaseObject{    public int Id { get; set; }    public int ProductId { get; set; }    public virtual Product Product { get; set; }    public int ParameterId { get; set; }    public virtual Parameter Parameter { get; set; }    public string Value { get; set; }}
查看完整描述

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í)間。


查看完整回答
反對(duì) 回復(fù) 2022-11-21
  • 1 回答
  • 0 關(guān)注
  • 143 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)