Asp.net 使用数据库外键的EntityFramework
实际上,我花了一整天的时间在外键的EntityFramework上。 假设我们有两张桌子。 Processapp\u id,process\u id LookupProcessIdprocess\u id,process\u描述 您可以理解两个具有名称的表,第一个表,使用process_id指示每个应用程序,描述在seoncd表中。 事实上,我尝试了很多次,并找出了如何在inquery中执行:就像Asp.net 使用数据库外键的EntityFramework,asp.net,vb.net,entity-framework,Asp.net,Vb.net,Entity Framework,实际上,我花了一整天的时间在外键的EntityFramework上。 假设我们有两张桌子。 Processapp\u id,process\u id LookupProcessIdprocess\u id,process\u描述 您可以理解两个具有名称的表,第一个表,使用process_id指示每个应用程序,描述在seoncd表中。 事实上,我尝试了很多次,并找出了如何在inquery中执行:就像 Dim result = (from x in db.Processes where x.Look
Dim result = (from x in db.Processes where x.LookupProcess is (from m in db.LookupProcessIds where descr = "example" select m).FirstOrDefault() select x).FirstOrDefault()
首先我想问的是有没有更简单的方法
我想问的第二个问题是关于插入的
p As New AmpApplication.CUEngData.Process
p.app_id=100
p.LookupProcess = (from m in db.LookupProcessIds where descr = "example" select m).FirstOrDefault()
db.AddToProcesses(p)
db.SaveChanges()
从外观上看,它看起来不错,但它给了我一个错误
“ampCuenenties.processs”中的实体参与“FK\u Process\u LookupProcess”关系。找到0个相关的“LookupProcess”。应为1个“LookupProcess”
我能问一下插入的内容是否错误吗?这是我的问题吗?关于你的第一个问题:
Dim result = (from x in db.Processes
where x.LookupProcess.descr = "example"
select x).FirstOrDefault()
实际上,您错过了DataEntityModel及其框架中的一些概念。要操作数据,必须从上下文的角度调用对象。这些允许您向ObjectStateManager指定DataObject的状态。在您的情况下,如果您有来自FK的依赖数据,则必须添加/更新从叶到根的任何链接数据 此示例演示了简单的无依赖数据操作。选择(如果存在)和插入或更新 如果需要有关ObjectStateManager操作的更多信息,请转到
我希望这会有所帮助。祝你今天愉快 关于你的第一个问题,请进一步说明@jeroenh的建议:
Dim result = (from x in db.Processes.Include("LookupProcess")
where x.LookupProcess.descr = "example"
select x).FirstOrDefault()
添加Include语句将使LookupProcess实体水合,以便您可以查询它们。如果没有Include,x.LookupProcess将为null,这可能解释了为什么会出现错误
如果将文字字符串用作要包含的参数并不理想,请参阅以获取使用嵌套实体执行此操作的示例
关于你的第二个问题,这一行
p.LookupProcess = (from m in db.LookupProcessIds
where descr = "example" select m).FirstOrDefault()
可能会在以后给您带来问题,因为如果没有具有示例的流程描述的LookupProcessId,您将得到null。发件人:
引用和可空类型的默认值为null
因此,如果插入实体时p.LookupProcess为null,则会出现异常:
“ampCuenenties.processs”中的实体参与“FK\u Process\u LookupProcess”关系。找到0个相关的“LookupProcess”。应为1个“LookupProcess”
为了避免此类问题,您需要在p.LookupProcess进入数据库之前检查它是否为null
If Not p.LookupProcess Is Nothing Then
db.AddToProcesses(p)
db.SaveChanges()
End If
对于第二部分,LookupProcess是否确实返回了一个实例?您所说的实例返回是什么意思?数据库中是否确实存在用于该描述的记录?实际上我以前尝试过这个,它说的是NULL pointer。。。。该版本的EF是否存在问题?如果有效,我是否可以使用p.LookupProcess.descr=example作为插入的方法?您是否可以只添加,而不是附加并将状态更改为“已添加”?尤其是在使用引用或其他任何内容操作数据时,不建议这样做。附加假定实体已在数据库中。另外,如果您将状态更改为“添加”,我相信EF不会看到任何差异。显然,如果您知道密钥并且数据库生成密钥,那么您希望使用Attach,但是如果您自己设置密钥,那么我相信Add是正确的做法。就相关实体而言,无论是附加还是添加都不理想。Attach将附加实体和所有相关实体,因此它将假定它们都在数据库中,而Add将添加实体和所有相关实体,因此它将假定它们都不在数据库中
If Not p.LookupProcess Is Nothing Then
db.AddToProcesses(p)
db.SaveChanges()
End If