实体框架、AutoMapper、处理实体更新

2024-04-08

我最近才开始使用Entity Framework 1.0,相信我已经开始感受到大家都在谈论的痛苦了。我正在尝试使用最佳实践,因此我有一组 DTO,可以通过 AutoMapper 映射到我的实体或从我的实体映射。

真正的问题是当我尝试更新对象时。第一个问题是我找不到创建新实体、从 DTO 传输数据并且仍然让实体 ObjectContext 意识到它已更改的方法。我使用了以下代码:

public VideoDTO UpdateVideo(VideoDTO pVideo)
        {
            Video video = new Video();
            Mapper.Map(pVideo, video);
            context.Attach(video); //Successfully attaches
            context.ApplyPropertyChanges("Videos", video);  // no changes made as far as entity knows b/c it was attached in it's updated state
            context.SaveChanges(); //doesn't save the entity                
            return pVideo;
        }

然后我想,也许我需要先从数据库中获取实体,附加到上下文,调用 Mapper 上的 Map 方法,然后调用 SaveChanges。这是我所做的:

    public VideoDTO UpdateVideo(VideoDTO pVideo)
    {
        Video video = context.Videos.Where(v => v.VideoId == pVideo.VideoId).FirstOrDefault();
        Mapper.Map(pVideo, video); //Error here: Can't change VideoId value on Video entity
        //context.Attach(video);
        //context.ApplyPropertyChanges("Videos", video);
        context.SaveChanges();

        return pVideo;
    }

现在我们遇到了可爱的 EF 问题,即不允许更改属性 VideoId,因为它由 Video 实体上的 EntityKey 属性使用。迷人的。我已经设置了映射,以便当我从 DTO 映射到 EF 实体时,EntityKey 属性将获得一个值。现在我需要一种方法来对该映射规则进行例外处理,但不知道从哪里开始。我想我可以在这个方法中创建一个全新的映射规则,并将 EntityKey 和 VideoId 属性设置为忽略,但这看起来相当草率。此外,我不确定此时创建的映射是否会保留。如果它覆盖了允许 DTO 将值映射到实体上的 EntityKey 的初始设置,则会以完全不同的方式适得其反。

有人有更好的主意吗?


自动映射器

您的第一个问题是,据我所知,AutoMapper 并非设计为从 DTO->仅实体实体->DTO。这可能最近发生了变化,所以我不太确定。有关自动映射器设计用途的更多信息,请参阅此链接:双向映射的情况 http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/09/17/the-case-for-two-way-mapping-in-automapper.aspx

药代动力学图谱

您说:“在此方法中映射规则,并将 EntityKey 和 VideoId 属性设置为忽略,但这看起来相当草率”

我认为这一点也不马虎。您确实不应该在持久化 EntityKey/PK 后触摸它,并且可能应该以某种方式编码其静态性。

实体框架

“现在我们遇到了可爱的 EF 问题,即不允许更改属性 VideoId,因为它由视频实体上的 EntityKey 属性使用。可爱。”

迷人的? EF 并不强迫你不更新你的 PK。在生成的模型中,您的密钥的设置器内有一个属性更改检查。解决方案是更改生成的代码。根据您的模型波动性,这可能不实用,但它是一种选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架、AutoMapper、处理实体更新 的相关文章

随机推荐

  • 使用C#正则表达式替换XML元素内容

    我正在编写一些处理记录 xml 数据的代码 并且我希望能够替换文档中某些元素 例如密码 的内容 我不想序列化和解析文档 因为我的代码将处理各种模式 输入文档示例 doc 1
  • 虚拟主机无法在 zend 框架中工作

    以下是我在 etc apache2 sites available 中的虚拟主机
  • 实体框架 6.1:字典中不存在给定的键

    我有一个带有一些关系的表 程序工作正常 直到我在该表和customer表 ddlPermissionCode表 第一表 如下 CREATE TABLE dbo PermissionCode Id int NOT NULL IDENTITY
  • Flutter 在选择时更改 TabItem 背景

    我想问一下 选择选项卡时如何更改选项卡项目背景颜色 抱歉 我是颤振的新手 使用底部标签栏还是标签栏更好 像这样 我的代码 bottomNavigationBar new TabBar tabs Tab icon new Icon Icons
  • 如何找到二维数组JAVA中元素的平均值? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要以下程序的帮助 编写一个方法 将二维双精度数组作为输入参数并返回数组元素的平均值 谁能告诉我该怎么做 我当前的代码 public
  • 通过 Slack API 发送命令

    有没有办法以编程方式发送command通过 API 到 Slack 我已成功发布消息 var postingResponse client UploadValues https slack com api chat postMessage
  • Android GPS 的准确度如何? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我好像在某处读过Android的GPS精度约为10厘米 任何人都可以验证或更正这个吗 原因是我正在尝试开发的应用程序会跟踪用户访问过的位置 这将极大地
  • 谷歌地图圆圈与标签

    我使用 google 地图 api 创建了地图视图 通过使用 google maps Circle 圆圈在地图上打印 将标记更改为圆圈 没有任何问题 但我无法在其中添加标签或文本 我该如何解决这个问题 这是我用来打印圆圈的代码 functi
  • 如何使用 fetch api 及其 javascript 加载 html 页面?

    我正在尝试使用 fetch API 加载 HTML 页面及其 JavaScript 脚本 我可以使用 ajax 和 JQuerySee here https stackoverflow com questions 50847274 fetc
  • NSUTF8StringEncoding 导致文件在 TextEdit/Pages 中渲染不正确,但在 BBEdit/vi 中则不会

    我遇到了一个有点奇怪的问题 每当我在 iOS 应用程序中创建新的文本文件时 我都会将其编码设置为NSUTF8StringEncoding 如果我编辑文件并输入任何带变音符号的字符并保存更改 则变音符号在某些应用程序 如 BBEdit Tex
  • 具有核心动画页面和长列表的聚合物芯片到卡图案

    一般来说 我发现很难使用core animated pages当我有一个滚动页面的很长列表时 聚合物元素可实现芯片列表到卡片类型模式 我认为困难在于 一旦过渡完成 隐藏部分就会从布局中取出 我很难找到解决这个问题的方法 简单的插图 JSFi
  • “Josephus-p‌r‌o‌b‌l‌e‌m” 在 python 中使用列表

    我想知道是否可以使用 python 中的列表来解决约瑟夫问题 简单来说 约瑟夫问题就是在圆形排列中找到一个位置 如果使用事先已知的跳过参数来处理执行 那么该位置将是安全的 例如 给定一个圆形排列 例如 1 2 3 4 5 6 7 并且ski
  • 无法使用 mailto uri 创建具有多个收件人的新邮件

    我正在使用创建一个Windows 8 1 应用商店 in WinRT 我无法通过用逗号或分号分隔每封电子邮件来使用 mailto uri 创建具有多个收件人的新邮件 两者都会给我相同的错误 Invalid URI The hostname
  • JUnit4 根据自定义 java 注释跳过测试

    我希望根据我用 Java 创建的自定义注释来执行 JUnit4 测试 此自定义注释的目的是让 JUnit4 注意到 仅当机器的平台与注释中指定的平台匹配时才应运行测试 假设我有以下注释 public interface Annotation
  • 在主程序.cs 文件中运行另一个 .cs 文件

    一般来说 我对编程很陌生 所以我确信这个问题很天真 因此 我编写了一个简单的神奇八球程序 我想转向冒险游戏 但我认为在游戏中包含八球程序会很简洁 就像制作一个控制台菜单 您可以在其中选择任一游戏 所以 我的问题是 我不知道如何将我的八球程序
  • 解析并获取 JSON 数据

    我有一个来自网站的 json 看起来像 Meta Data 1 Information Daily Prices open high low close and Volumes 2 Symbol MSFT 3 Last Refreshed
  • 以编程方式设计 GUI - 嵌套布局和多个小部件 (Qt) 的良好实践

    我有兴趣更好地理解Qt为此我想see 如何仅以编程方式完成嵌套布局和多个小部件 GUI 的相对复杂示例 即不使用 Qt Creator 的设计 我见过几个示例代码仅演示非常简单的布局 并且几乎总是不使用头文件 事实上我见过的大多数例子 du
  • Skip 的性能(以及类似功能,如 Take)

    我刚刚看了一下源代码Skip Take NET Framework 的扩展方法 在IEnumerable
  • WPF相当于ActiveControl?

    在表单中 我可以简单地使用 ActiveControl name 来获取活动控件的名称 然而在 WPF 中这不起作用 与 Activecontrol name 等效的 WPF 命令是什么 我会选择 C 或 VB 无论哪种方式 谢谢你 有几种
  • 实体框架、AutoMapper、处理实体更新

    我最近才开始使用Entity Framework 1 0 相信我已经开始感受到大家都在谈论的痛苦了 我正在尝试使用最佳实践 因此我有一组 DTO 可以通过 AutoMapper 映射到我的实体或从我的实体映射 真正的问题是当我尝试更新对象时