1

我正在寻找一种更好的方法来使用实体框架更新记录。

下面是我现在使用的,其中 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 的真实示例

您可以使用 Automapper 或 MiBu 说的类似的东西。在 Player的此处创建一个 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)Stackoverflow 上的类似答案说自己做。

这取决于您的应用程序的复杂性,但我会考虑使用命令模式将消息发送到包含您的属性的适当处理程序并让处理程序更新它们。如果它成功了,我们就做一件事,如果不成功,我们就做另一件事。MVC in Action中描述了相同的模式。看到类似的(这里是链接)[ http://www.paulstovell.com/clean-aspnet-mvc-controllers]这里是第二个链接

于 2012-09-27T23:32:06.737 回答