EntityFramework和DbContext,将实体转换为DTO并返回

时间:2012-08-10 11:08:58

标签: c# entity-framework dto

首先是一些背景信息:

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

我有以下实体模型:

DTO是自动生成的。

现在问题:

Participent是使用VisibleStatusStatusStatusMessage和两个ContactGroups创建的“开始”对象。创建完成后,我想添加Contact已创建的ParticipentContactGroup

这里的问题是,实体框架没有意识到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已经存在的对象?因为大多数对象都是嵌套的,所以我更倾向于使用相当通用的解决方案。

1 个答案:

答案 0 :(得分:0)

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

 context.ObjectStateManager
     .ChangeObjectState
     (group, System.Data.EntityState.Unchanged);