Fork me on GitHub

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

在使用 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),是修改不成功的,这边纪录一下这个问题,有时间研究下。

详细资料:

posted @   田园里的蟋蟀  阅读(2673)  评论(16)    收藏  举报
编辑推荐:
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
· 通过一个DEMO理解MCP(模型上下文协议)的生命周期
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
阅读排行:
· 工良出品 | 长文讲解 MCP 和案例实战
· 多年后再做Web开发,AI帮大忙
· 国产的 Java Solon v3.2.0 发布(央企信创的优选)
· centos停服,迁移centos7.3系统到新搭建的openEuler
· 记一次 .NET某旅行社酒店管理系统 卡死分析
历史上的今天:
2013-11-06 C算法编程题(五)“E”的变换
点击右上角即可分享
微信分享提示