【发布时间】:2014-05-09 14:11:07
【问题描述】:
我有一个仅封装一些数据库模型属性的视图模型。视图模型包含的这些属性是我要更新的唯一属性。我希望其他属性保持其价值。
在我的研究过程中,我发现this 答案似乎非常适合我的需求,但是,尽管我尽了最大努力,但我无法让代码按预期工作。
这是我想出的一个孤立的例子:
static void Main() {
// Person with ID 1 already exists in database.
// 1. Update the Age and Name.
Person person = new Person();
person.Id = 1;
person.Age = 18;
person.Name = "Alex";
// 2. Do not update the NI. I want to preserve that value.
// person.NINumber = "123456";
Update(person);
}
static void Update(Person updatedPerson) {
var context = new PersonContext();
context.Persons.Attach(updatedPerson);
var entry = context.Entry(updatedPerson);
entry.Property(e => e.Name).IsModified = true;
entry.Property(e => e.Age).IsModified = true;
// Boom! Throws a validation exception saying that the
// NI field is required.
context.SaveChanges();
}
public class PersonContext : DbContext {
public DbSet<Person> Persons { get; set; }
}
public class Person {
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public int Age { get; set; } // this is contrived so, yeah.
[Required]
public string NINumber { get; set; }
}
我做错了什么?
【问题讨论】:
-
你为什么要附加这个人?通常,当我使用实体框架时,我只是检索记录,修改其属性并执行 SaveChanges();类似于: Person person = context.People.First(); person.Name = "约翰"; context.SaveChanges();
-
因为这需要对数据库进行两次查询 + 实际上,我使用的是通用存储库。
-
这并不是一个真正的通用存储库,但无论如何,@Areks 表示 +1。如果您担心 2 个查询,那么您还有其他问题
-
@mituw16 尽管如此,我还是想知道为什么这段代码不起作用。感谢您的 cmets。
-
尝试 entry.State = EntityState.Modified;
标签: c# entity-framework entity-framework-6.1