0

こんにちは、以下のすべてのソリューションは、MeetingRoomRequestテーブルにレコードを作成し、そのリクエストに関連するアメニティをMeetingRoomRequestAmenityLinkテーブルに追加するという点で機能します。ただし、少し不格好な感じがするので、MVC3とEntityFrameworkを使用したより良いソリューション(つまり、2つのコンテキストインスタンスを作成する必要がない)があるかどうか疑問に思いましたか?

SQLServerとEntityFrameworkで必要な関係(1対多)を設定したことに注意してください。

また、AmenityListはidの配列であることに注意してください(例:[1,2,4])

private readonly IDataRepository<MeetingRoomRequest> _meetingRoomRequestRepository = new DataRepository<MeetingRoomRequest>();
private readonly IDataRepository<MeetingRoomRequestAmenityLink> _meetingRoomRequestAmenityLinkRepository = new DataRepository<MeetingRoomRequestAmenityLink>();

var meetingRoomRequestToAdd = new MeetingRoomRequest
{
    User = meetingRoomRequestViewModel.User,
    UserEmail = meetingRoomRequestViewModel.UserEmail,
    Title = meetingRoomRequestViewModel.Title,
    Comments = meetingRoomRequestViewModel.Comments,
    StartDateTime = meetingRoomRequestViewModel.StartTime,
    EndDateTime = meetingRoomRequestViewModel.EndTime,
    RequestStatusID = (int)Enums.RequestStatus.New,
    AttendeeCount = meetingRoomRequestViewModel.AttendeeCount,
    AttendeeType = meetingRoomRequestViewModel.AttendeeType,
    OfficeID = meetingRoomRequestViewModel.OfficeId,
    LocationID = meetingRoomRequestViewModel.LocationId, 
};
_meetingRoomRequestRepository.Add(meetingRoomRequestToAdd);
_meetingRoomRequestRepository.SaveChanges();
var meetingRoomRequestAdded = meetingRoomRequestToAdd;

foreach (var item in meetingRoomRequestViewModel.AmenityList)
{
    var meetingRoomRequestAmenityLinkToAdd = new MeetingRoomRequestAmenityLink
    {
        AmenityID = item,
        MeetingRoomRequestID = meetingRoomRequestAdded.MeetingRoomRequestID
    };
    _meetingRoomRequestAmenityLinkRepository.Add(meetingRoomRequestAmenityLinkToAdd);
    _meetingRoomRequestAmenityLinkRepository.SaveChanges();
}
4

1 に答える 1

1

あなたのやり方は正しいように見えますが、リクエストの処理効率を改善できるいくつかの改善点があります。

  1. これらは子/親の関係であるため、親エンティティを作成してから、親エンティティで変更の保存を呼び出す前に、foreachループで子をアタッチできます。EFは、子オブジェクトの外部キー値に、親からのプライマリ(または関連するキー)を自動的に入力します。
  2. エンティティを変数に保存しなくても、引き続き使用できます。EFのオブジェクト追跡は、関数全体でこれを追跡し続けます。
  3. savechangesをforeachループの外に移動することで、呼び出しの数を減らすことができます。最後の1回の呼び出しで同じ量のSQLが送信されると思いますが、接続を開いたり閉じたりしないことが増える可能性があります。EFからも他の組み込みの効率があるかもしれません

コード

var meetingRoomRequestToAdd = new MeetingRoomRequest
        {
            User = meetingRoomRequestViewModel.User,
            UserEmail = meetingRoomRequestViewModel.UserEmail,
            Title = meetingRoomRequestViewModel.Title,
            Comments = meetingRoomRequestViewModel.Comments,
            StartDateTime = meetingRoomRequestViewModel.StartTime,
            EndDateTime = meetingRoomRequestViewModel.EndTime,
            RequestStatusID = (int)Enums.RequestStatus.New,
            AttendeeCount = meetingRoomRequestViewModel.AttendeeCount,
            AttendeeType = meetingRoomRequestViewModel.AttendeeType,
            OfficeID = meetingRoomRequestViewModel.OfficeId,
            LocationID = meetingRoomRequestViewModel.LocationId, 
        };
        _meetingRoomRequestRepository.Add(meetingRoomRequestToAdd);

        foreach (var item in meetingRoomRequestViewModel.AmenityList)
        {
            meetingRoomRequestToAdd.MeetingRoomRequestAmenityLinks.Add(new MeetingRoomRequestAmenityLink
            {
                AmenityID = item
            });
        }
        _meetingRoomRequestRepository.SaveChanges();
于 2012-09-28T15:22:42.307 に答える