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

详细资料:

【记录】EF Code First 实体关联,如何添加、修改实体?的更多相关文章

  1. MVC 使用EF Code First数据迁移之添加字段

    PM> add-migration 20161109   -Force 正在为迁移“20161109”搭建基架.此迁移文件的设计器代码包含当前 Code First 模型的快照.在下一次搭建迁移 ...

  2. EF里查看/修改实体的当前值、原始值和数据库值以及重写SaveChanges方法记录实体状态

    本文目录 查看实体当前.原始和数据库值:DbEntityEntry 查看实体的某个属性值:GetValue<TValue>方法 拷贝DbPropertyValues到实体:ToObject ...

  3. Entity Framework Code First添加修改及删除外键关联实体

    1.添加外键关联实体 1>.添加新的Province及City实体 using (var ctx = new PortalContext()) { var city1 = new City { ...

  4. Entity Framework Code First添加修改及删除单独实体

    对于一个单独实体的通常操作有3种:添加新的实体.修改实体以及删除实体. 1.添加新的实体 Entity Framework Code First添加新的实体通过调用DbSet.Add()方法来实现. ...

  5. EF Code First:实体映射,数据迁移,重构(1)

    一.前言 经过EF的<第一篇>,我们已经把数据访问层基本搭建起来了,但并没有涉及实体关系.实体关系对于一个数据库系统来说至关重要,而且EF的各个实体之间的联系,实体之间的协作,联合查询等也 ...

  6. EF Code First:实体映射,数据迁移,重构

    经过EF的<第一篇>,我们已经把数据访问层基本搭建起来了,但并没有涉及实体关系.实体关系对于一个数据库系统来说至关重要,而且EF的各个实体之间的联系,实体之间的协作,联合查询等也都依赖于这 ...

  7. 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】

      [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...

  8. EF Code First 一对多、多对多关联,如何加载子集合?

    应用场景 先简单描述一下标题的意思:使用 EF Code First 映射配置 Entity 之间的关系,可能是一对多关系,也可能是多对多关系,那如何加载 Entity 下关联的 ICollectio ...

  9. Entity Framework Code First实体关联数据加载

    在项目过程中,两个实体数据之间在往往并非完全独立的,而是存在一定的关联关系,如一对一.一对多及多对多等关联.存在关联关系的实体,经常根据一个实体的实例来查询获取与之关联的另外实体的实例. Entity ...

随机推荐

  1. MongooseHelper

    /** * Created by lbc on 2016/11/16. */var mongoose=require("mongoose");var db=mongoose.con ...

  2. 【OAuth2.0】Spring Security OAuth2.0篇之初识

    不吐不快 因为项目需求开始接触OAuth2.0授权协议.断断续续接触了有两周左右的时间.不得不吐槽的,依然是自己的学习习惯问题,总是着急想了解一切,习惯性地钻牛角尖去理解小的细节,而不是从宏观上去掌握 ...

  3. Flask 重新认识

    总是觉的学习东西有点猴子掰玉米的感觉.今天就重新再掰一次吧. Installation: 安装之前建议先安装virtualenv,这个东东是帮助你在多个python版本之间保持同步,不至于python ...

  4. java web(六)多个请求对应一个Servlet

    概要: 提交请求的常用方式有两种,get/post , 运行程序后被请求,在加载执行web.xml文件时通过该文件中的映射关系找到即将要执行的Servlet; 而在要执行的Servlet文件中可通过反 ...

  5. tomcat context配置

    <Context path="/ext" docBase="/eqp/export" />                访问目录         ...

  6. Python之路第一课Day6--随堂笔记(面向对象 )

    本节内容: 1. 面向对象编程介绍 2. 为什么要用面向对象进行开发? 3. 面向对象的特性:封装.继承.多态 4. 类.方法   一.面向过程 VS 面向对象  1. 编程范式 编程是 程序 员 用 ...

  7. 关于DOM的一些笔记(一)

    这篇文章整理的是关于DOM的一些学习笔记,这样以后查找起来也方便许多.(以前js看的是入门经典和DOM编程艺术,现在在看高级程序设计,本文就以高级程序为主整理) 1.Node (1):类型 node. ...

  8. C# 定时器 Timers.Timer Forms.Timer

    1.定义在System.Windows.Forms里 Windows.Forms里面的定时器比较简单,只要把工具箱中的Timer控件拖到窗体上,然后设置一下事件和间隔时间等属性就可以了 //启动定时器 ...

  9. 10000 Reasons(Matt Redman)

     这是一首很感动的主内歌曲,听了无首次,还是很感动,这里把歌词贴出来,一方面是为了记忆歌词,另一方面是为以后怀念记忆.(20:44:38) Bless the lord,oh my soul oh m ...

  10. review简历之感想和建议

    最近帮很多朋友review他们的简历,总结起来存在以下问题: 1,简历太多页了.请尽量不超过两页.一般地,每个hr阅读简历的时间大概在20s甚至更少,写那么多页不仅毫无必要,而且有害. 而且我怀疑一般 ...