Невозможно обновить статус флага Isactive в нескольких таблицах - PullRequest
0 голосов
/ 07 мая 2019

У меня есть класс модели, такой как

public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public bool IsActive { get; set; }
    public virtual ICollection<ProductSKU> ProductSKUs { get; set; 
 }

public class ProductSKUResponse
{
    public int Skuid { get; set; }
    public String Sku { get; set; }
    public decimal MRP { get; set; }
    public bool IsActive { get; set; }
}

Я хочу обновить isactive статус в нескольких таблицах, но я не нахожу решение, поэтому прошу вас сообщить мне логику.

public async Task<ReturnBoolean> DeleteProductById(int Id, bool status)
{
    ReturnBoolean response = new ReturnBoolean();
    Contracts.Entities.Product product = await _productRepository.GetByIdAsync(Id);

    if (product == null)
    {
        throw new ArgumentException("Unable to delete selected product, product does not exist");
    }

    product.IsActive = status;
    product.UpdatedOn = DateTime.Now;
    product.ProductSKUs = await productSkuRepository.GetProductSkus(Id);

    // from this onwards I didn't understand how to assign status value to in product.ProductSKUs.isactive.

    await _productRepository.UpdateAsync(product, true);
    response.BooleanValue = true;
    return response;
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Я бы избегал таких утверждений, как:

product.ProductSKUs = await productSkuRepository.GetProductSkus(Id);

Либо загрузите их вместе с продуктом, либо просто обновите их отдельно. Проблема с универсальными репозиториями или репозиторием на объект заключается в том, что вы не можете легко использовать такие вещи, как энергичная загрузка или полная мощность Linq.

using (var context = new ProductContext())
{
   var product = context.Products.Include(x => x.ProductSKUs).Single(x => x.Id = ID);
   product.IsActive = status;
   foreach( var productSKU in product.ProductSKUs)
       productSKU.IsActive = status;
}

или используя репозитории:

var productSKUs = await productSkuRepository.GetProductSkus(Id);
foreach( var productSKU in product.ProductSKUs)
    productSKU.IsActive = status;

Присвоение коллекции продукту, вероятно, нормально, но я бы не стал назначать что-либо, не связанное с рассматриваемым действием, потому что SaveChanges будет искать все модификации и пытаться их сохранить. Установка коллекции после загрузки объекта - это то, что посылает предупреждающие знаки всякий раз, когда я ее вижу. :)

0 голосов
/ 08 мая 2019

Попробуйте простой foreach

foreach(ProductSKU productSKU in product.ProductSKUs.ToList())
{
   productSKU.IsActive = status;
}

Но это также зависит от того, как реализован этот метод _productRepository.UpdateAsync(product, true)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...