【记录】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),是修改不成功的,这边纪录一下这个问题,有时间研究下。
详细资料:
- Entity Framework Add/Attach and Entity States
 - Add One-to-Many Relationship Entity Graph using DBContext
 
【记录】EF Code First 实体关联,如何添加、修改实体?的更多相关文章
- MVC 使用EF Code First数据迁移之添加字段
		
PM> add-migration 20161109 -Force 正在为迁移“20161109”搭建基架.此迁移文件的设计器代码包含当前 Code First 模型的快照.在下一次搭建迁移 ...
 - EF里查看/修改实体的当前值、原始值和数据库值以及重写SaveChanges方法记录实体状态
		
本文目录 查看实体当前.原始和数据库值:DbEntityEntry 查看实体的某个属性值:GetValue<TValue>方法 拷贝DbPropertyValues到实体:ToObject ...
 - Entity Framework Code First添加修改及删除外键关联实体
		
1.添加外键关联实体 1>.添加新的Province及City实体 using (var ctx = new PortalContext()) { var city1 = new City { ...
 - Entity Framework Code First添加修改及删除单独实体
		
对于一个单独实体的通常操作有3种:添加新的实体.修改实体以及删除实体. 1.添加新的实体 Entity Framework Code First添加新的实体通过调用DbSet.Add()方法来实现. ...
 - EF Code First:实体映射,数据迁移,重构(1)
		
一.前言 经过EF的<第一篇>,我们已经把数据访问层基本搭建起来了,但并没有涉及实体关系.实体关系对于一个数据库系统来说至关重要,而且EF的各个实体之间的联系,实体之间的协作,联合查询等也 ...
 - EF Code First:实体映射,数据迁移,重构
		
经过EF的<第一篇>,我们已经把数据访问层基本搭建起来了,但并没有涉及实体关系.实体关系对于一个数据库系统来说至关重要,而且EF的各个实体之间的联系,实体之间的协作,联合查询等也都依赖于这 ...
 - 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】
		
[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...
 - EF Code First 一对多、多对多关联,如何加载子集合?
		
应用场景 先简单描述一下标题的意思:使用 EF Code First 映射配置 Entity 之间的关系,可能是一对多关系,也可能是多对多关系,那如何加载 Entity 下关联的 ICollectio ...
 - Entity Framework Code First实体关联数据加载
		
在项目过程中,两个实体数据之间在往往并非完全独立的,而是存在一定的关联关系,如一对一.一对多及多对多等关联.存在关联关系的实体,经常根据一个实体的实例来查询获取与之关联的另外实体的实例. Entity ...
 
随机推荐
- 取消TableViewCell选中状态的外观变化
			
tabelViewcell 使用Xib创建自定义外观的时候,在tableview选中的时候,cell的外观会发生变化,在定义Xib中如下图将选中的外观状态取消掉 也有其他选项,可以选择控制选中的时候的 ...
 - Spotlight监控Oracle数据库的链接创建
			
最近在做性能测试时,由于要挂载空间数据,开发人员直接将所有业务表都挂到了Oracle数据库中.最近做了几次测试发现响应时间和吞吐量都不是很理想,进行一番分析后怀疑可能在Oracle中出现问题,因此再网 ...
 - Public key for mysql....rpm is not installed
			
解决方案: 此时导入rpm的签名信息即可,用root登录,执行下面命令(我的linux版本是centos 5.1) 原文地址: http://my.oschina.net/u/555639/blog/ ...
 - C#_技巧:真伪随机数
			
使用 Random 产生随机数.(这是一种伪随机数,需要seed,同一个seed后,采用某种算法产生的数字序列都是一样的) 两种写法 错误 for(int i=0;i<100;i++) { ...
 - window下搭建c开发环境(GNU环境的安装)
			
一.在windows平台上安装GNU环境 windows操作系统不自带GNU环境,如果需要开发跨平台的C语言程序,那么需要给windows安装GNU环境 windows下的两款GNU环境:MinGW和 ...
 - Microsoft .NET Framework 4.0.3版下载
			
适用于 Microsoft .NET Framework 4 的更新 4.0.3,其中包含一系列新增功能,用于满足高端客户的功能需求和重要 .NET Framework 方案的需求. http://w ...
 - 循序渐进做项目系列(5):制作安装包,谁人都可以!——VS制作安装包简明教程
			
一开始让我做安装包的时候,其实我是拒绝的.因为我根本就不会做安装包.查了资料之后,我很懵,很晕,很乱,因为不清晰,不简明,不直白.然而经过一番彷徨的挣扎,我终于发现:制作安装包,谁人都可以!故挥狼毫, ...
 - 自己动手写游戏:Flappy Bird
			
START:最近闲来无事,看了看一下<C#开发Flappy Bird游戏>的教程,自己也试着做了一下,实现了一个超级简单版(十分简陋)的Flappy Bird,使用的语言是C#,技术采用了 ...
 - Azure SQL Database (21) 将整张表都迁移到Azure Stretch Database里
			
<Windows Azure Platform 系列文章目录> Azure SQL Database (19) Stretch Database 概览 Azure SQL Da ...
 - Node.js教程系列~目录
			
Node.js这个东西在近几年火起来了,而且会一直火下去,无论在infoq还是在cnblogs,csdn上,都可以到处看到它的样子,它主推的应该就是异步式I/O 吧,是的,设计的很完美,很吸引人,虽然 ...