首先是一些背景信息:
我有一台提供wcf soap服务的服务器和一个使用这些服务的网站。服务器使用实体框架来写入/读取数据库。在此过程中,实体对象将转换为DTO,并在返回服务器时返回。
我有以下实体模型:
DTO是自动生成的。
现在问题:
Participent
是使用VisibleStatus
,Status
,StatusMessage
和两个ContactGroups
创建的“开始”对象。创建完成后,我想添加Contact
已创建的Participent
和ContactGroup
。
这里的问题是,实体框架没有意识到participent和联系人组已经存在于数据库中,并且它为这些创建了一个新的数据库条目。即使他们已经有了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已经存在的对象?因为大多数对象都是嵌套的,所以我更倾向于使用相当通用的解决方案。
答案 0 :(得分:0)
您需要将现有对象的State
设置为EntityState.Unchanged
。
例如,对于一个团体
context.ObjectStateManager
.ChangeObjectState
(group, System.Data.EntityState.Unchanged);