首先是一些背景信息:
我有一个提供 wcf soap 服务的服务器和一个使用这些服务的网站。服务器使用实体框架向数据库写入/读取数据。在此过程中,实体对象被转换为 DTO,并在它们返回服务器时返回。
我有以下实体模型:
DTO 是自动生成的。
现在解决问题:
Participent
是用 a VisibleStatus
、 a Status
、 aStatusMessage
和 two创建的“开始”对象ContactGroups
。在创建这些之后,我想添加Contact
已经创建的Participent
和ContactGroup
.
这里的问题是,实体框架没有意识到参与者和联系人组已经存在于数据库中,而是为它们创建了一个新的数据库条目。即使他们已经有一个ID。我认为问题在于实体被转换为 DTO 并返回。
假设以下客户端代码生成参与者、可见状态、状态、状态消息和联系人组:
MT_Stammdaten_MeineKontakte_ParticipentDTO user = new MT_Stammdaten_MeineKontakte_ParticipentDTO();
user.MT_Participant_Id = endUserId;
user.StatusMessage = new StatusMessageDTO()
{
Text = "not defined",
Timestamp = DateTime.Now,
};
user.VisibleStatus = new VisibleStatusDTO()
{
Photo = null,
Status = new StatusDTO()
{
Value = "not defined"
},
Timestamp = DateTime.Now
};
user = cClient.AddParticipantMapping(user);
ContactGroupDTO defaultGroup = new ContactGroupDTO()
{
Name = CONTACTS_GROUP_STANDARD,
Description = CONTACTS_GROUP_STANDARD_DESC,
Participent = user,
};
ContactGroupDTO familyGroup = new ContactGroupDTO()
{
Name = CONTACTS_GROUP_FAMILY,
Description = CONTACTS_GROUP_FAMILY_DESC,
Participent = user,
};
defaultGroup = cClient.AddContactGroup(defaultGroup);
familyGroup = cClient.AddContactGroup(familyGroup);
现在创建联系人的代码:
MT_Stammdaten_MeineKontakte_ParticipentDTO participent = cClient.getUser(endUserId);
ContactGroupDTO group = cClient.GetContactGroup(1);
MT_Stammdaten_MeineKontakte_EndUser endUser = new MT_Stammdaten_MeineKontakte_EndUser()
{
MT_EndUser_Id = newContactId,
};
ContactDTO contact = new ContactDTO()
{
ContactGroup = group,
ContactGroupId = group.Id,
MT_Stammdaten_MeineKontakte_EndUser = endUser,
MT_Stammdaten_MeineKontakte_Participent = participent,
}
contact = cClient.AddContact(contact);
如何告诉实体框架具有 id 的对象已经存在?由于大多数对象都是嵌套的,我更喜欢一个相当通用的解决方案。