Entity Framework обновляет дочернюю сущность, когда я пытаюсь обновить родительскую сущность - PullRequest
0 голосов
/ 01 мая 2020

У меня есть объект Product, который сопоставлен с таблицей Product:

[Table("Product")]
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } 
    public decimal Price { get'; set; }
}

У меня также есть объект CombinedProduct, который сопоставлен с CombinedProductView, обратите внимание, что этот объект предназначен только для чтения, этот представление не обновляется :

[Table("CombinedProductView")]
public class CombinedProduct : Product
{
    public string Store { get; set; } 
}

И это мое MyDbContext:

[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MyDbContext: DbContext
{
    public MyDbContext() : base("MyDB")
    {
    }

    public DbSet<Product> Product { get; set; }
    public DbSet<CombinedProduct> CombinedProduct { get; set; }
}

У меня есть хранилище, в котором есть метод для возврата List из Product с и другой способ сохранения Product с:

Public class ProductRepository
{
    public List<Product> GetProductsMoreExpensiveThan(decimal price)
    {
        return _context.Product.AsNoTracking().Where(p => p.Price > price).ToList();
    }

    public void Update(List<Product> products)
    {
        foreach (var p in products)
        {
            _context.Product.Attach(p);
            _context.Entry(p).State = EntityState.Modified;
        }

        _context.SaveChanges();
    }
}

Я хочу увеличить цену на некоторые продукты на 5 долларов, поэтому я получаю список Product с и увеличиваю цену :

var products = _productRepository.GetProductsMoreExpensiveThan(100);
foreach(var p in products)
{
    p.Price += 5;
}

_productRepository.Update(products);

Это исключение, потому что EF пытается обновить CombinedProductView, который не обновляется. Почему Entity Framework пытается обновить производную сущность (CombinedProduct) при обновлении базовой сущности Product?

1 Ответ

1 голос
/ 01 мая 2020

Я полагаю, что путаница исходит от вашего базового класса Product с атрибутом [Table("Product")], а затем с производным классом, дополнительно имеющим его.

Вы можете использовать базовый класс в объекте типы в EF, однако, этот базовый класс обычно НЕ представляет таблицу.

Здесь есть много разворачиваться относительно методов, как вы можете сделать эту работу, вместо того, чтобы пытаться расширить это до сумасшедшего уровня детализации в этой статье о Стратегиях наследования с EF должно помочь прояснить ситуацию, так как содержит подробности об основах имен таблиц и т. Д. c.

...