更新实体框架

时间:2016-02-25 03:46:20

标签: c# asp.net-mvc entity-framework

我想更新Entity Framework中的多个列。我现在用这个:

var user = new Relations { Id=1, Status = 1, Date = DateTime.Now, Notification = 0 };

db.Relations.Attach(user);

db.Entry(user).Property(x => x.Status).IsModified = true;
db.Entry(user).Property(x => x.Notification).IsModified = true;
db.Entry(user).Property(x => x.Date).IsModified = true;

db.Configuration.ValidateOnSaveEnabled = false;
db.SaveChanges();

有没有更好的方法来更新列而不重复代码db.Entry(user).Property几次?

5 个答案:

答案 0 :(得分:3)

你可以使用EntityState像这样:

var user=db.users.Find(userId);
user.name="new name";
user.age=txtAge.text;
user.address=txtAddress.text;
context.Entry(user).EntityState=Entitystate.Modified;

答案 1 :(得分:1)

我更喜欢使用:

var existingUser = context.Set<User>().Where(u => u.Id == 1);
context.Entry(existingUser).CurrentValues.SetValues(user);

或者你可以使用像GraphDiff这样的第三个库。

答案 2 :(得分:1)

哟更新您不需要执行此操作的实体:

// build your entity object with new values
var user = new Relations { Id=1, Status = 1, Date = DateTime.Now, Notification = 0 };
//attach as modified in one single step
db.Entry(user).State = EntityState.Modified;
//execute update
db.SaveChanges();

这假设您正在设置所有实体字段,并且您的实体中没有RowVersion字段。管理这些其他情况需要额外的步骤。

答案 3 :(得分:0)

试试这个,

var app = angular.module("productsApp", [])
    .service("serviceProvider", function ($http) {
        this.getDatas = function getDatas(data) {
            return $http({
                method: 'POST', url: serviceUrl + '/GetProductsByCategoryOrName', headers: {
                    'Authorization': apiKey
                },
                data: data
            })
        }
        return this
    });

function GetController($scope, serviceProvider) {
    var data = { "query": "grocery", "categoryId": "976759", "pageIndex": 0, "sortDirection": "asc" };
    serviceProvider.getDatas(data).then(function (response) {
        $scope.products = response.data.data;
    });
}

function searchProductsController($scope, serviceProvider) {
    var data = { "query": $scope.searchText, "categoryId": "976759", "pageIndex": 0, "sortDirection": "asc" };

    $scope.submit = function () {
        serviceProvider.getDatas(data).then(function (response) {
            console.log(response.data.data);
            $scope.products = response.data.data;
        });
    }
};

答案 4 :(得分:0)

当通过上下文获取项目时

除非您更改默认行为,否则

会在该上下文中自动跟踪。

所以你可以这么简单:

var txtInputAge = 18;
var txtAdrressLine1 = "Some cool place"

//fetch the user
var user = db.Users.Find(userId);

//change the properties
user.Name = "new cooler name";
user.Age = txtInputAge;
user.Address = txtAdrressLine1;

//call save changes
db.SaveChanges();

更新 - 添加看起来像

//create new entry
User user = new User();

user.Name = "new cooler name";
user.Age = txtInputAge;
user.Address = txtAdrressLine1;

//add to context
db.Users.Add(user);

//call save changes
db.SaveChanges();