在 Linq to SQL 中设置外键

2023-11-22

众所周知,如果实体已加载,则无法直接在 Linq to SQL 中设置外键 ID。但是,您可以通过外键查找实体,然后使用实体关系将实体设置为外部实体。 (为了简单起见,我在这里取出了枚举并使用整数值)。即,如果我有一个已加载的约会实体和关联的 AppoinmentStatus 实体,我无法执行此操作:-

ExistingAppointment.AppointmentStatusID = 7

但我可以这样做:-

ExistingAppointment.AppointmentStatus = (From appstat In db.AppointmentStatus _
                                        Where appstat.StatusID = 7 _
                                        Select appstat).Single

我的代码中有这种东西,我想重构。所以...

我显然可以在这样的模块中使用辅助方法:-


Module Helper
    Public Shared Function GetAppointmentStatus(ByVal AppStatusID As Integer) As AppointmentStatus
        GetAppointmentStatus = (From appstat In db.AppointmentStatus _
                                       Where appstat.AppointmentStatusID = AppStatus _
                                       Select appstat).Single
    End Function
End Module

我什至可以将其变成扩展方法,就像这样。


Imports System.Runtime.CompilerServices
Module Helper
Extension()> _
    Public Shared Function GetAppointmentStatus(ByVal db as DataClassesDataContext, ByVal AppStatusID As Integer) As AppointmentStatus
        GetAppointmentStatus = (From appstat In db.AppointmentStatus _
                                       Where appstat.AppointmentStatusID = AppStatusID _
                                       Select appstat).Single
    End Function
End Module

我还可以将其放入 Linq to SQL 部分类中,如下所示。


Partial Public Class DataClassesDataContext    
    Public Function GetAppointmentStatus(ByVal AppStatusID As Integer) As AppointmentStatus
        GetAppointmentStatus = (From appstat In Me.AppointmentStatus _
                                       Where appstat.AppointmentStatusID = AppStatusID _
                                       Select appstat).Single
    End Function
End Class

此外,我可以将代码放入 Linq to SQL Appointment Entity 部分类中,如下所示:-


Partial Public Class Appointment    
    Public Function GetAppointmentStatus(ByVal db as DataClassesDataContext, ByVal AppStatusID As Integer) As AppointmentStatus
            GetAppointmentStatus = (From appstat In db.AppointmentStatus _
                                       Where appstat.AppointmentStatusID = AppStatusID _
                                       Select appstat).Single
    End Function
End Class

我应该做什么,为什么,或者有更好的选择吗?


对此有两种主要的思想流派:

  1. 将逻辑放入DataContext(部分类,或者实际类,如果你编码的话DataContext用手)。这背后的理由是你的DataContext已经了解所有不同的实体,因此这不会创建任何额外的耦合,也不会导致类膨胀。

    当然,缺点是,如果您有几百个这样的 API 方法(并且您最终可能会这样做),那么您的DataContext很快就会开始变成一团泥球,里面充满了任何程序员决定投入的每个随机查询 API。您可以尝试通过将相关函数分离到同一部分的不同实例中来清理它DataContext类,但这实际上只是表面上的改进。

  2. 将逻辑放入存储库类中,即AppointmentRepository。这种方法的两个优点是(a)能够在存储库和 IoC 框架上使用依赖项注入,以防您决定更改数据模型,以及(b)您坚持使用单一责任原则- 它实际上使sense让方法就在它所在的地方。

    将它们放入存储库的主要缺点是: (a) 它们可能会重复您的存储库中已经存在的非常相似的逻辑。DataContext作为存储过程; (b) 当涉及到事务管理时,它们有一种令人头痛的方式(如果你也使用它们来保存); (c) 当您开始有大量自定义查询,这些查询返回针对特定操作或报告专门定制的 DTO 时,您只剩下两个糟糕的选择:为每个 DTO 创建一个存储库,或者创建一个主数据库所有 DTO 或其中一些松散相关组的“实用程序”存储库。两者最终都是一个相当糟糕的设计。

这些就是权衡;只有您可以决定哪个更适合您自己的目的。

I would绝对建议against扩展方法方法,因为扩展方法很难发现(您不能只键入方法并让 Intellisense 选取相关参考),并且当您有能力直接修改或扩展时,它们也根本没有必要(通过部分)原始类。

我还建议不要延长Appointment班级;我们使用 Linq To SQL 等工具的原因之一是我们可以处理 POCO 实体don't需要知道他们来自哪里。出于这个原因,我个人非常反对实体类与它们的耦合DataContext- 依赖关系应该只是单向的。

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

在 Linq to SQL 中设置外键 的相关文章

  • 如何在不下载内容的情况下执行 GET 请求?

    我正在开发一个链接检查器 一般来说我可以执行HEAD请求 但是有些网站似乎禁用了这个动词 所以在失败时我还需要执行GET请求 仔细检查链接是否确实已失效 我使用以下代码作为我的链接测试器 public class ValidateResul
  • 计算从给定日期开始的月份中的第几天?

    我正在努力寻找一种简单有效的解决方案来计算每月的工作日 例如 如果给定日期是第一个星期一Monday 5th March 2018然后我想获取接下来 6 个月每个月第一个星期一的日期 例如 Monday 2nd April 2018 and
  • 在 VB2010 Windows 窗体开始时播放 .wav/.mp3 文件?

    制作 VB2010 已经大约一年了 最近开始突破我可以将哪种媒体合并到我的表单中的界限 但我无法播放 wav 或 mp3 文件 我尝试按照微软和其他编码网站上的教程进行操作 但没有成功 任何帮助 将不胜感激 要播放波形文件 您可以简单地使用
  • 生成Excel文件错误

    我在经典 ASP 中使用以下代码生成 Excel 文件 代码很简单并且有效 我在 Windows Vista x86 上的 IIS 7 0 下运行代码 两个问题 有一个奇怪的警告框 这是屏幕快照 http i27 tinypic com 2
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 我应该如何在 VB.NET 中进行转换?

    所有这些都相等吗 在什么情况下我应该选择其中一个而不是其他 var ToString CStr 变量 CType 变量 字符串 DirectCast 变量 字符串 编辑 来自的建议不是我自己 https stackoverflow com
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 创建带有部分的选项卡式侧边栏 WPF

    我正在尝试创建一个带有部分的选项卡式侧边栏 如 WPF 中的以下内容 我考虑过几种方法 但是有没有更简单 更优雅的方法呢 方法一 列表框 Using a ListBox并将 SelectedItem 绑定到右侧内容控件所绑定的值 为了区分标
  • 设置 runat=server 时输入名称和 id 发生变化

    在我的表单中 我需要插入 文本 类型的不同输入 输入必须是带有名称和 ID 的 html 控件 因为我将此表单发送到外部网址 对于验证 我在所有输入中执行 runat server 然后我可以使用 requiredfieldvalidato
  • 文件显示在 Visual Studio 的解决方案资源管理器中,并带有快捷方式图标。这意味着什么?

    我已经下载了FParsec的库源代码 所有文件都带有快捷方式符号 这是什么意思 当该项目添加到该项目时 它被添加为链接Project gt Add Existing Item gt Add as Link 该文件很可能托管在目录结构中的另一
  • WCF 服务调用包装器

    为 WCF 服务调用创建包装器的最佳实践是什么 我认为有必要 为了在同一个地方监视所有呼叫 我正在考虑使用这种代码 这是正确的想法吗 RetType t ServiceExecutionContext
  • C#:询问用户密码,然后将其存储在 SecureString 中

    在我目前为客户开发的小型应用程序中 我需要询问用户他的 Windows 登录用户名 密码和域 然后使用这些信息系统 诊断 进程 启动启动一个应用程序 我有一个带有 UseSystemPasswordChar 的文本框来屏蔽输入的密码 我需要
  • Visual Basic - 未将对象引用设置为对象的实例

    我在 VB Net 中收到以下错误 你调用的对象是空的 它在 For 循环末尾突出显示 Next 任何帮助都会很棒 Imports System IO Public Class LoginForm Dim Username As Strin
  • Android 手机作为 GSM 调制解调器在 PC 上发送/接收短信?

    是否可以将 Android 移动设备用作 PC 上的 GSM 调制解调器 我正在 net下开发应用程序来发送 接收短信等 现在我想通过 USB 将我的 Android 设备连接到我的 PC 并将其用作 GSM 调制解调器来与其通信 这里是参
  • 获取 FTP 服务器上的文件大小并将其放在标签上

    我正在尝试获取托管在FTP服务器并将其放入Label而 BackgroundWorker 在后台工作 我在用着 Try 来获取该值 但是该值在第一次尝试时被捕获 下载后 如果我按尝试再次获取它 那么它就可以工作 Note 第一次尝试时进度条
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • 以编程方式添加的捆绑产品未显示在前端

    我正在尝试从 PHP 脚本将捆绑产品插入 Magento 数据库 有问题的版本是社区 1 5 1 0 我尝试了问题中描述的方法 使用简单商品的 SKU ID 以编程方式在 Magento 中添加捆绑产品 插入的产品在管理部分中显示得很好 我
  • 是否应该在 Web 应用程序中禁用实体框架延迟加载?

    我听说您应该在 Web 应用程序中禁用 EF 的延迟加载功能 ASP NET Here and here 对于初学者 现在我在这里真的很困惑 因为我一直认为应该始终启用延迟加载 因为它可以防止从数据库获取不必要的数据 所以 现在我的问题是
  • 在 iOS Core Data 中存储高精度纬度/经度数字

    我正在尝试将纬度 经度存储在核心数据中 这些最终精度为 6 到 20 位 无论出于何种原因 我将它们作为核心数据中的浮点数 将它们四舍五入而不给我返回确切的值 我尝试了 十进制 类型 但也没有运气 NSStrings 是我唯一的选择吗 ED
  • grunt-contrib-jasmine 和 PhantomJS 安全性

    我收到错误 XMLHttpRequest 无法加载https my api domain com Access Control Allow Origin 不允许 Origin file 当我尝试运行一些通过 grunt contrib ja
  • 使用关联数组的 D3 日历视图

    我想创建一个日历视图 如下例所示 http bl ocks org 4063318 其实我正在尝试修改它 我有一个像这样的关联数组 AdminCourt 2012 10 02 2 2012 10 09 2 2012 10 16 1 Cons
  • Java 无法使用正则表达式 \s,显示:无效的转义序列

    我想用 替换字符串中的所有空白字符 用 ss 替换所有 它对于 效果很好 但不知何故 eclipse 不允许我使用 s 作为空白 我尝试了 t 但它也不起作用 我收到以下错误 无效的转义序列 有效的转义序列 是 b t n f r 这是我的
  • 将元素值反序列化为字符串,尽管它包含混合内容

    假设这样的 XML
  • 将数据框日期列的 dd-mm-yyyy 日期格式更改为 yyyy-mm-dd [重复]

    这个问题在这里已经有答案了 我有这个熊猫数据框df Name Date Score Score2 Joe 26 12 2007 53 45 53 4500 Joe 27 12 2007 52 38 52 7399 Joe 28 12 200
  • 单元测试控制台 C# 应用程序的最佳方法

    我有一个简单的控制台应用程序 它是用一个普通的 main 来触发的 整个程序都在 main 中 它使用命令行解析器库 然后 我在解决方案中有第二个项目 其中包含应用程序的单元测试 但我似乎没有找到从测试中启动主程序进程的好方法 我当前实际启
  • 如何获取UIImage的dpi/ppi?

    iOS 中如何获取图像的 dpi ppi 也许原始图像文件包含这些信息 所以我可以从 NSData 获取 ppi dpi 谢谢 要从 NSData 中存储的图像中提取 DPI 请在项目中包含 Apple 的 ImageIO 框架并使用以下命
  • ASP.NET MVC3:通过控制器加载图像

    我尝试使用来自的答案here 但没有成功 我有以下代码 public ActionResult ShowImage using FileStream stream new FileStream Path Combine Server Map
  • 在 Jupyter Notebook 中使用 Tkinter

    我刚刚开始使用 Tkinter 并尝试在 python 中创建一个简单的弹出框 我从网站上复制粘贴了一段简单的代码 from Tkinter import master Tk Label master text First Name gri
  • 如何在kafka中创建新的消费者组

    我按照快速入门指南上的说明在本地运行 kafkahere 然后我在中定义了我的消费者组配置config consumer properties这样我的消费者就可以从定义的中选择消息group id 运行以下命令 bin kafka cons
  • 在 Twitter Bootstrap 的 ScrollSpy 中,我到底可以在哪里放置 data-spy="scroll" ?

    文档上说得很清楚 只需将 data spy scroll 添加到您想要监视的元素 最典型的是主体 但看来只有戴在身上才能发挥作用 当我将其放入我想要监视的任何其他元素时 导航的最后一个元素将被选中 Here它在身体上 并且有效 并且this
  • 默认打印 XSLT 1.0 文本节点

    我看过XSL xsl 模板匹配 但那里没有提到触发我的问题的匹配模式 我有一个相当复杂的 XML 结构
  • 使用openGL截屏并保存为png

    我正在尝试截取全屏屏幕截图并将其另存为 png 格式 我找到了一个代码here并对其进行了一些修改 对于屏幕截图 我使用 openGL 和 Glut 并使用 c 的 gd 库以 png 格式保存 我得到的只是一张黑色的 png 我不明白为什
  • Google Chrome 扩展开发中的 ES6 模块(意外标记)

    是否可以在 Google Chrome 扩展开发中使用 ES6 模块 我收到 意外的令牌导出 或 意外的令牌导入 好吧 您可以在 Chrome 的兼容性表中看到 并非所有内容都可用 Chrome 擅长在每个版本中添加 ES6 功能 但目前不
  • datatrigger 绑定到 viewmodel 属性

    我正在尝试创建一个简单的样式数据触发器 该触发器从视图模型属性中提取其绑定值 如下所示
  • Android - 从密钥库导出单个密钥/别名

    我有一个密钥库 JKS 其中包含不同应用程序的许多密钥条目 别名 现在 一个应用程序将移至另一位开发人员 我想为他导出 提取单个密钥 别名 gt keytool exe list keystore Keystorefile Keystore
  • 在 Linq to SQL 中设置外键

    众所周知 如果实体已加载 则无法直接在 Linq to SQL 中设置外键 ID 但是 您可以通过外键查找实体 然后使用实体关系将实体设置为外部实体 为了简单起见 我在这里取出了枚举并使用整数值 即 如果我有一个已加载的约会实体和关联的 A