当我试图更新父实体时,实体框架正在更新子实体。

问题描述 投票:0回答:1

我有一个 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; }
}

我有一个存储库,它有一个方法来返回一个 ListProduct和另一种保存方法 Products:

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?

c# entity-framework entity-framework-6
1个回答
1
投票

我相信你的困惑来自于你的基类的 Product 拥有 [Table("Product")] 属性,然后派生类也有一个。

在EF中,你可以在对象类型中使用一个基类,但是,这个基类通常不是代表一个表。

在这里有很多方法需要解开,你可以管理如何使其工作,因此,与其试图将其扩展到一个疯狂的细节水平,这篇文章关于 "基类"。EF的继承策略 它提供了关于表名等基础知识的细节,应该有助于澄清它。

© www.soinside.com 2019 - 2024. All rights reserved.