0

最初にいくつかの背景情報:

wcf soap サービスを提供するサーバーと、それらのサービスを利用する Web サイトがあります。サーバーはエンティティ フレームワークを使用して、データベースへの書き込み/データベースからの読み取りを行います。プロセス中に、エンティティ オブジェクトは DTO に変換され、サーバーに戻ると元に戻ります。

私は次のエンティティモデルを持っています:

DTO は自動生成されます。

今問題に:

は、 a 、 a 、 a 、および twoParticipentで作成される「開始」オブジェクトです。それらが作成された後、既に作成された と を追加したいと思います。VisibleStatusStatusStatusMessageContactGroupsContactParticipentContactGroup

ここでの問題は、エンティティ フレームワークが、参加者と連絡先グ​​ループが既にデータベースに存在していることを認識せず、それらの新しいデータベース エントリを作成することです。すでに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 に答える