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

    详细资料:

  • 相关阅读:
    Linux进程管理工具Supervisor
    RSA加密传输代码示例
    静态网站创建工具Docusaurus
    Proactor和Reactor模型
    机器学习中的七宗罪
    Tokio internals: Understanding Rust's asynchronous I/O framework from the bottom up
    开源软件创建SOC的一份清单
    How to setup SOC using open-source tools
    彼得定律
    深入浅出通信原理连载
  • 原文地址:https://www.cnblogs.com/xishuai/p/add-modify-one-to-many-entity-using-dbcontext.html
Copyright © 2020-2023  润新知