c# – 如何在Entity Framework代码第一个数据库中手动设置实体主
发布时间:2020-12-15 06:18:21 所属栏目:百科 来源:网络整理
导读:好吧,我有以下模型结构:我有一个类 – 基本上是 DatabaseEntity public class DatabaseEntity{ public int Id { get; set; }} 所以像产品,类别等每个实体都将继承DatabaseEntity并拥有Id属性.此外,我有典型的EntityFramework存储库类与InsertOrUpdate方法:
好吧,我有以下模型结构:我有一个类 – 基本上是
DatabaseEntity
public class DatabaseEntity { public int Id { get; set; } } 所以像产品,类别等每个实体都将继承DatabaseEntity并拥有Id属性.此外,我有典型的EntityFramework存储库类与InsertOrUpdate方法: private readonly DbContext _database; public void InsertOrUpdate<TObject>(TObject entity) where TObject : DatabaseEntity { if(entity.Id == default(int)) { // New entity DbSet<TObject>().Add(entity); } else { // Existing entity _database.Entry(entity).State = EntityState.Modified; } _database.SaveChanges(); } 然后我从eBay下载eBay api列表中的categoies我必须添加到数据库中.基本上类别是: public class EbayCategory : DatabaseEntity { // It has Id since it inherits DatabaseEntity public string Name { get; set; } // ... some other properties } 但问题是,当我下载这些类别时,我下载了他们的Id属性,当然,这些属性已经有了价值.当我尝试将它们保存到数据库时: public void UpdateCategories(IEnumerable<EbayCategory> newCategories) { foreach (var newCategory in newCategories) { _repository.InsertOrUpdate(newCategory); } } 我面临一些问题…首先,entity.Id!= default(int)因为它有值,所以存储库尝试更新这个实体,而不是添加,但它不在数据库或上下文中,所以它抛出以下例外: System.Data.Entity.Infrastructure.DbUpdateConcurencyException "Store update,insert,or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries." …因为它认为其他人删除了我想要更新的实体.如何保存此InsertOrUpdate逻辑,因为很多项目都基于它,并且能够将具有主键(Id)的项目(EbayCategories)添加到数据库,然后像其他实体一样更新/删除它们而不丢弃EbayCategory.Id值? 解决方法
要允许您手动生成ID,您需要一个具有手动生成ID的类 – 因此它无法从DatabaseEntity继承
public class EbayCategory { [DatabaseGenerated(DatabaseGeneratedOption.None)] public int Id { get; set; } public string Name { get; set; } // ... some other properties } 现在,您将需要一个不同的InsertOrUpdate来处理具有手动生成密钥的实体: public void InsertOrUpdate(EbayCategory entity) { if(Find(entity.ID == null) { // New entity DbSet<EbayCategory>().Add(entity); } else { // Existing entity _database.Entry(entity).State = EntityState.Modified; } _database.SaveChanges(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |