gpt4 book ai didi

c# - Entity Framework Code First - 为什么我不能以这种方式更新复杂的属性?

转载 作者:IT王子 更新时间:2023-10-29 04:17:02 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 4.1(代码优先)开发一个小型示例项目。我的类(class)如下所示:

public class Context : DbContext
{
public IDbSet<Person> People { get; set; }
public IDbSet<EmployeeType> EmployeeTypes { get; set; }
}

public class Person
{
[Key]
public int Key { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }

virtual public EmployeeType EmployeeType { get; set; }
}

public class EmployeeType
{
[Key]
public int Key { get; set; }
public string Text { get; set; }

virtual public ICollection<Person> People { get; set; }
}

我已经将几个 EmployeeTypes(“first”、“second”)保存到数据库中,并且保存了一个具有第一种类型的 Person。现在我想修改人。我知道我可以通过加载 Person、更改属性然后保存来完成此操作。但我想做的是:

var c = new Context();
var e = c.EmployeeTypes.Single(x => x.Text.Equals("second"));
var p = new Person {
Key = originalKey, // same key
FirstName = "NewFirst", // new first name
LastName = "NewLast", // new last name
EmployeeType = e }; // new employee type
c.Entry(p).State = EntityState.Modified;
c.SaveChanges();

奇怪的是,这会更改 FirstName 和 LastName,但不会更改 EmployeeType。如果我得到一个新的 Context 并请求这个 Person,EmployeeType 仍然设置为“first”,就像运行此代码之前一样。

我需要做什么才能让导航属性更新,而不仅仅是标量属性?(这尤其令人费解,因为对于 EmployeeType,唯一真正需要更改的是Person 表中的外键,并且该键是标量属性。)

(顺便说一下,我知道我可以通过先检索 Person,然后一个一个地更改属性来做到这一点,但是当我在 ASP.NET MVC 中使用模型绑定(bind)时,似乎这种方式是更容易,因为我的 POST 方法中已经有了更新的 person 对象。)

最佳答案

你可以尝试不同的方式:

var c = new Context();
var e = c.EmployeeTypes.Single(x => x.Text.Equals("second"));
var p = new Person {
Key = originalKey, // same key
FirstName = "NewFirst", // new first name
LastName = "NewLast"}; // new last name
c.People.Attach(p); // Attach person first so that changes are tracked
c.Entry(p).Reference(e => e.EmployeeType).Load();
p.EmployeeType = e; // Now context should know about the change
c.Entry(p).State = EntityState.Modified;
c.SaveChanges();

其他方法是在您的 Person 实体中公开外键,例如:

public class Person
{
[Key]
public int Key { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[ForeignKey("EmployeeType")]
public int EmployeeTypeKey { get; set; }
public virtual EmployeeType EmployeeType { get; set; }
}

这会将PersonEmployeeType 之间的关系类型从独立关联更改为外键关联。而不是分配导航属性分配外键属性。这将允许您通过当前代码修改关系。

问题是独立关联(那些不使用外键属性的关联)在状态管理器/更改跟踪器中作为单独的对象处理。因此,您对人的修改不会影响现有关系的状态,也不会设置新关系。 I asked on MSDN如何使用 DbContext API 执行此操作,但只有将 DbContext 转换为 ObjectContext 并使用 ObjectStateManagerChangeRelationshipState 才有可能>.

关于c# - Entity Framework Code First - 为什么我不能以这种方式更新复杂的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5506116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com