微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何在Entity Framework代码第一个数据库中手动设置实体主键?

好吧,我有以下模型结构我有一个类 – 基本上是 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();
}

原文地址:https://www.jb51.cc/csharp/95933.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐