【记录】EF Code First 实体关联,如何添加、修改实体?

时间:2021-02-23 06:21:49

在使用 EF Code First 的时候,我们经常会对项目中的 Entry 进行一对多、多对多的映射配置,这时候就会产生主实体和子实体的概念,我们在添加、修改他们的时候,有时候会产生一些问题,比如添加主实体的时候,我们不想添加子实体,看一个 User-Role 场景:

public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Age { get; set; }
public string Address { get; set; }
public DateTime DateAdded { get; set; }
public virtual Role Role { get; set; }
}
public class Role
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime DateAdded { get; set; }
}

User 和 Role 是一对多的关系,比如我们添加一个 User 对象,然后给这个对象的 Role 属性赋一个已存在的 Role 对象值,示例代码:

using (var context = new UserRoleDbContext())
{
User user = new User { Name = "test", Age = "12", Address = "test" };
user.Role = context.Role.Find(1);
context.Users.Add(user);
context.SaveChanges();
}

这段代码实际运行结果是,数据库添加了一个 User,但也同时添加了一个 Role,这是我们不想要的,正确的应该这样配置:

using (var context = new UserRoleDbContext())
{
User user = new User { Name = "test", Age = "12", Address = "test" };
user.Role = context.Role.Find(1);
context.Entry(user.Role).State = EntityState.Unchanged;
context.Users.Add(user);
context.SaveChanges();
}

如何修改数据呢?示例代码:

using (var context = new UserRoleDbContext())
{
User user = context.Users.Find(1);
user.Role = context.Role.Find(1);
context.Entry(user).State = EntityState.Modified;
context.SaveChanges();
}

上面修改示例代码很简单,所以也不会出现什么问题,但是我们平常在使用 EF 的时候,并不会这样写,比如我们要修改一个 Entry,这个对象不会是从 Context 中获取的,而是使用 MVC,在View 中获取的,这时候我们再赋属性对象值进行修改,我试了一下,Entry 的普通属性类型(比如 int、string 等),是可以修改的,但是如果是关联属性对象(比如上面的 Role),是修改不成功的,这边纪录一下这个问题,有时间研究下。

详细资料: