我正在通过实体框架追逐我的尾巴场景。我的架构是MVC网站,C#WCF RESTful Web服务层,实体框架代码第一个DB层。
我在数据库中有一个DbUserProfile对象。每个用户在许多类别中选择他们的偏好,例如他们的饮食,种族,身体类型等。这些选择来自数据库中保存的预设列表。使用Code-First,我设计了一个对象层次结构,以便基类被称为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并尝试更新配置文件对象,EF认为它是一个新的DietChoice对象,忽略Id = 1并将其保存在最后的UserChoice表中,例如Id = 142。 / p>
这看起来非常混乱,我确信我的设计做得不好但有人能指出我回到正轨吗?