Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 使用数据库外键的EntityFramework_Asp.net_Vb.net_Entity Framework - Fatal编程技术网

Asp.net 使用数据库外键的EntityFramework

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

实际上,我花了一整天的时间在外键的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.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