0

首先是一些背景信息:

我有一个提供 wcf soap 服务的服务器和一个使用这些服务的网站。服务器使用实体框架向数据库写入/读取数据。在此过程中,实体对象被转换为 DTO,并在它们返回服务器时返回。

我有以下实体模型:

DTO 是自动生成的。

现在解决问题:

Participent是用 a VisibleStatus、 a Status、 aStatusMessage和 two创建的“开始”对象ContactGroups。在创建这些之后,我想添加Contact已经创建的ParticipentContactGroup.

这里的问题是,实体框架没有意识到参与者和联系人组已经存在于数据库中,而是为它们创建了一个新的数据库条目。即使他们已经有一个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 的对象已经存在?由于大多数对象都是嵌套的,我更喜欢一个相当通用的解决方案。

4

1 回答 1

0

您需要将State现有对象上的 设置为EntityState.Unchanged。例如,对于一组

 context.ObjectStateManager
     .ChangeObjectState
     (group, System.Data.EntityState.Unchanged);
于 2012-08-10T11:55:48.507 回答