1

Entity Framework を使用してレコードを更新するより良い方法を探しています。

以下は私が現在使用しているもので、playerFromModel は View から取得したデータです。

public bool UpdatePlayer(PlayerEntity playerFromModel)
{
    bool updateSuccessfull = false;

    using (var context = new PlayerEntities())
    {
        var player = context.Player.Where(m => m.emailAddress == playerFromModel.EmailAddress).FirstOrDefault();

        if (player != null)
        {
            player.emailAddress = playerFromModel.EmailAddress;
            player.first_name = playerFromModel.FirstName;
            player.last_name = playerFromModel.LastName;
            player.alt_email_id1 = playerFromModel.AlternateEmailAddress;
            player.street = playerFromModel.Street;
            player.city = playerFromModel.City;
            player.state = playerFromModel.State;
            player.zip = playerFromModel.Zip;
            player.country_code = playerFromModel.CountryCode;
            player.phone1 = playerFromModel.Phone;

            try
            {
                context.SaveChanges();
                updateSuccessfull = true;
            }
            catch
            {
                updateSuccessfull = false;
            }
        }
    }

    return updateSuccessfull;
}

ご覧のとおり、各フィールドを手動でマッピングする必要があり、どこでも同じアプローチをとっています。

これを行うためのより良い方法が絶対にあるはずだと考えていました。

これについて私を案内してください。ありがとう。

4

1 に答える 1

5

TryUpdateModelを使用するだけです。例えば

    bool updateSuccessfull = false;
    using (var context = new PlayerEntities())
    {
        var player = context.Player.Where(m => m.emailAddress == playerFromModel.EmailAddress).FirstOrDefault();

        if (player != null)
        {
             //Beware this will try to map anything it can. This can be dangerous
            if(TryUpdateModel(player)){
            try
            {
                context.SaveChanges();
                updateSuccessfull = true;
            }
            catch
            {
                updateSuccessfull = false;
            }
         }
        }
    }
    return updateSuccessfull;
}

ここではTryUpdateModel、ASP .NET MVC 3の実際の例は見ません。

MiBuが言ったように、Automapperまたは同様のものを使用できます。プレーヤーの ViewModelリンクを作成し、そこからエンティティにマップします。

//Get a PlayerUpdate ViewModel     

       using (var context = new PlayerEntities())
    {
   // fetch the domain model that we want to update - BTW I'd use a repository pattern but that is another debate
        var player = context.Player.Where(m => m.emailAddress == playerFromModel.EmailAddress).FirstOrDefault();

        if (player != null)
        {

        // Use AutoMapper to update only the properties of this domain model
        // that are also part of the view model and leave the other properties unchanged
        AutoMapper.Map<UpdatePlayerViewModel , PlayerEntity>(viewModel, player);

           try
            {
                context.SaveChanges();
                updateSuccessfull = true;
            }
            catch
            {
                updateSuccessfull = false;
            }
    }

ただし、エンティティ プロパティの更新は重要であり、自動的に行うべきではないと私は考えています。他の人も同じように感じます。AutoMapper を作成した Jimmy Bogard は、双方向のマッピングが必要だとは考えていないようです(しかし、彼は、要件に合わせて AutoMapper を構築したことも一因であると述べてます)。

アプリケーションの複雑さにもよりますが、コマンド パターンを使用して、プロパティを含む適切なハンドラーにメッセージを送信し、ハンドラーにそれらを更新させることを検討します。成功した場合は、1 つのことを行い、そうでない場合は別のことを行います。MVC in Actionにも同様のパターンが記述されています。同様のものを参照してください(ここにリンクがあります)[ http://www.paulstovell.com/clean-aspnet-mvc-controllers]およびここに2番目のリンクがあります

于 2012-09-27T23:32:06.737 に答える