如何在实体框架代码优先数据库中手动设置实体主键?

2023-12-23

好吧,我有以下模型结构:我有一个类 -DatabaseEntity这基本上是

public class DatabaseEntity
{
    public int Id { get; set; }
}

所以每个实体(如产品、类别等)都会继承DatabaseEntity并有Id财产。我也有典型的EntityFramework存储库类InsertOrUpdate method:

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 api 从 eBay 下载我必须添加到数据库的类别列表。基本上类别是:

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逻辑,因为很多项目都基于它,并且能够添加项目(EbayCategories)与主键(Id)到数据库,然后像其他实体一样更新/删除它们而不丢弃EbayCategory.Id value?


为了允许您手动生成 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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在实体框架代码优先数据库中手动设置实体主键? 的相关文章

  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • Visual Studio 2015 EDMX 模型浏览器和图表丢失

    我最近更新到 Visual Studio 2015 打开我的解决方案并运行 直到我决定将一个实体添加到我的 edmx 中 因此 我双击 edmx 文件来打开图表 或者至少是模型浏览器 但它只打开一个 XML 页面 我检查了安装程序中任何丢失
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • 我可以使用 lambda 函数或 std::function 对象来代替函数指针吗?

    我有一个需要使用的库 它定义了以下内容 typedef void CallbackFunction const int i 并且有一个注册回调的函数 如下所示 void registerCallback CallbackFunction p
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 为什么这段代码显示答案为 6? [复制]

    这个问题在这里已经有答案了 我的一个同学问了这个问题 我想确定我告诉他的是正确的答案 本质上 下面的代码 确实显示 6 作为答案 在到达 MessageBox Show i ToString 时让他感到困惑 我的解释是递减操作 i 实际上并
  • E0701 OOZIE 工作流程中的 XML 架构错误

    以下是我的workflow xml
  • 有角。使用 APP_INITIALIZER 时路由器 DI 不工作

    我正在从服务器预加载应用程序配置APP INITIALIZER通过以下方式 AppModule providers ConfigService provide APP INITIALIZER useFactory configService
  • CSS 动画旋转3d 在 Safari 中不起作用

    无论我如何尝试 我都无法让该动画在 Safari 12 中正常工作 我已经尝试过供应商前缀等 但没有任何效果 它在 Chrome 中运行良好 有人有主意吗 div class spinners div 这是CSS keyframes spi
  • 使用 Flask/blueprint 制作一些静态页面

    所以我对如何使用 Flask 构建页面而不必声明每个视图有点困惑 我如何制作一个可以在我想要加载的页面上拾取的蓝图 说这些是我的示例页面 templates layout html section1 subsection index htm
  • 在 WPF 和 Silverlight 中实现 INotifyProperty 对静态属性的更改

    问题是如何实施INotifyPropertyChanged在静态属性上 因为您实现的事件不是静态的 并且不能由静态属性调用 此外 您无法绑定到 Silverlight 中的静态属性 我已经看到这个问题出现在一些论坛上 并提供了各种解决方案
  • 防止内容扩展网格项

    TL DR 有没有类似的东西table layout fixedCSS 网格 我尝试创建一个年视图日历 其中包含月份的大 4x3 网格 以及用于日期的嵌套 7x6 网格 日历应填满页面 因此年份网格容器的宽度和高度均为 100 year g
  • 无法将包含字符串的对象写入文件

    我正在用 C 开发一个电话簿项目 我创建了一个类 里面有字符串对象来存储一些字符串 我的程序无法将字符串数据写入文件 这让我很困扰 它只显示最后插入的数据 这是示例程序 给出了我想要做什么以及问题出在哪里的基本想法 include
  • 如何在 glmer 中获取随机效应的 p 值

    我想根据行动和国家层面的特征 使用 glmer 来分析抗议的主张何时针对国家 因此 我想获得固定效应和随机效应的 p 值 我的模型如下所示 targets lt glmer state ENV HLH HRI LAB SMO Capital
  • 如何验证 HTML 是否符合 W3C 标准

    我有一个使用以下命令生成 HTML 页面的项目Velocity https en wikipedia org wiki Apache Velocity模板和Java 但大部分页面不符合W3C http en wikipedia org wi
  • ng2-charts 访问基础图表对象

    我在用着ng2 图表 http valor software com ng2 charts 在我的 ionic 2 项目中绘制折线图 我需要访问 chartClick 事件中的图表数据点集合 为此 我需要访问图表的基本 Chart js 对
  • Android 搜索栏,带有自定义拇指,其中包含动态文本

    我想创建 android 自定义SeekBar having 带有文字的拇指在其中显示当前的搜索位置 这是我的代码 SeekBar sb Override public void onCreate Bundle savedInstanceS
  • 在对话框流中创建谷歌助手应用程序时,如何在谷歌操作中创建建议输入?

    我想在谷歌助手应用程序中做出响应时提示允许用户进行选择 我正在对话流中创建它 我该怎么做呢 如果您想将 建议输入 项目添加到您的对话体验中 就像它们在模拟器或屏幕设备上显示的那样 那么您正在谈论 建议筹码 https developers
  • C# - 将项目从列表视图拖到垃圾桶中?

    如何将一个项目从 Winforms listview 控件拖到另一个控件 垃圾桶的图片 上 UPDATE1 我认为基本流程是 对于列表视图上的 ItemDrag 事件 有一个 DoDragDrop 然后在图片框上有一个 DragEnter
  • SQL ORDER 字符数字

    我有一列存储为字符的数字 当我对此列执行 ORDER BY 时 我得到以下信息 100 131 200 21 30 31000 etc 如何对这些字符进行数字排序 我是否需要转换某些内容 或者是否已经有用于此目的的 SQL 命令或函数 谢谢
  • JSON::XS“用法”呱呱叫

    我似乎无法使用JSON XS的OO接口正常 以下是我无法追踪到的错误 use JSON XS my array foo bar my coder JSON XS gt new gt utf8 gt pretty print coder gt
  • 在 MATLAB 中从信号中提取 EEG 分量

    我在 MATLAB 中有一个简单的 EEG 信号 如下图所示 我想要的是根据下表提取脑电图的成分 Delta 高达 4 Hz 西塔 4 gt 8 Hz 阿尔法 8 gt 13 Hz 贝塔 13 gt 30 Hz 伽玛 30 gt 100 H
  • C#:向二进制文件写入和读取列表

    我写了一个程序 有一个User类 保存到文件中以存储用户信息 但是 可能有多个不同的用户 因此不是将文件保存为单个用户 而是将文件保存为用户列表 这是在 XNA 中 因此是一个游戏 但这实际上不会对事情产生任何影响 用户拥有硬币 皮肤 库存
  • 在c++中嵌入python:选择python版本

    我已经寻找问题的答案很长一段时间了 但我找到的答案似乎都不能解决我的问题 我正在尝试使用 Python 提供的功能 Python h Py xxx 函数等 将 Python 嵌入到我的 C 代码中 但是 我在让我的 C 程序调用正确的 Py
  • 如何在实体框架代码优先数据库中手动设置实体主键?

    好吧 我有以下模型结构 我有一个类 DatabaseEntity这基本上是 public class DatabaseEntity public int Id get set 所以每个实体 如产品 类别等 都会继承DatabaseEntit