Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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
C# 实体框架无法识别现有对象_C#_Wcf_Entity Framework - Fatal编程技术网

C# 实体框架无法识别现有对象

C# 实体框架无法识别现有对象,c#,wcf,entity-framework,C#,Wcf,Entity Framework,我正在使用实体框架进行通常的追尾场景。我的架构是MVC网站,C WCF RESTful web服务层,实体框架代码第一个数据库层 我在数据库中有一个DbUserProfile对象。每个用户在许多类别中选择自己的偏好,如饮食、种族、体型等。这些选择来自数据库中的预设列表。首先使用代码,我设计了一个对象层次结构,这样基类被称为UserChoice,其他所有类都继承自该类,例如DietChoice、EthnicityChoice、BodyTypeChoice。父类只包含两个属性,Id和Descript

我正在使用实体框架进行通常的追尾场景。我的架构是MVC网站,C WCF RESTful web服务层,实体框架代码第一个数据库层

我在数据库中有一个DbUserProfile对象。每个用户在许多类别中选择自己的偏好,如饮食、种族、体型等。这些选择来自数据库中的预设列表。首先使用代码,我设计了一个对象层次结构,这样基类被称为UserChoice,其他所有类都继承自该类,例如DietChoice、EthnicityChoice、BodyTypeChoice。父类只包含两个属性,Id和Description。EF表示这一点,将它们全部放在具有鉴别器列的同一个表中

我通过包含用户选择的实际用户选择对象(而不仅仅是ID)来表示我的配置文件对象。因此UserProfile类包含实际的DietChoice对象、BodyTypeChoice对象等

为了将对象传递到我的网站UI层,我将所有EF对象转换为属性相同的模型对象,只是不同的对象类型以分离层和依赖项。因此,在数据层中,它是一个DbUserProfile,然后我将其转换为一个UserProfile对象,然后通过WCF传递给网站。然后,用户对其配置文件进行更改,提交更新,并将UserProfile对象发送回web服务进行更新。web服务将其转换回DbUserProfile对象,并尝试在存储库中更新它

我遇到的问题是由于EF和模型对象之间的转换,当它往返并转换回Db对象时,EF认为它是一个新对象,并尝试作为新对象插入。它似乎没有查看对象的主键,识别它已经存在并更新它。特别是,如上所述,用户有大约15种选择。我希望数据层理解这些选项已经存在于数据库中,并通过Id列链接。但是如果您选择Id为1的DietChoice并尝试更新profile对象,EF会认为它是一个新的DietChoice对象,忽略Id为1并将其保存在末尾的UserChoice表中,例如Id为142


这看起来很混乱,我肯定我的设计有问题,但有人能告诉我正确的方向吗?

听起来是一个非常好的干净设计。显而易见的方法是在服务中实现逻辑,调用一个SP更新实体,而不使用EF或b从DB获取实体,并使用服务中的实体更新实体并保存它。另一种解决方案可能是修改ObjectState管理器中的实体,但我不建议这样做。我期待着答案,因为我也在使用EF…一件有趣的事情是,我在实验中偶然发现,如果你使用显式外键,这个问题似乎消失了。例如,如果您有Profile.Diet、Profile.EthnicityId等对象本身,那么也可以添加DietId和EthnicityId参数,EF会根据惯例选择这些参数。重新映射回EF DB对象时,不要填充饮食和种族对象,而只填充DietId和EthinicityId整数属性。这似乎有效!