我有一个 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
s:
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
?
我相信你的困惑来自于你的基类的 Product
拥有 [Table("Product")]
属性,然后派生类也有一个。
在EF中,你可以在对象类型中使用一个基类,但是,这个基类通常不是代表一个表。
在这里有很多方法需要解开,你可以管理如何使其工作,因此,与其试图将其扩展到一个疯狂的细节水平,这篇文章关于 "基类"。EF的继承策略 它提供了关于表名等基础知识的细节,应该有助于澄清它。