Entity FrameWork对有外键关联的数据表的添加操作
前天做了一个MVC Entity FrameWork项目,遇到有外键关联的数据编辑问题。当你编辑的时候,按照正常的逻辑,把每个字段的数据都对号入座了,然后点击保存按钮,本以为会顺理成章的编辑数据,但是EF却与众不同,它就是不如你所愿,当你查看数据列表的时候,你会发现列表中莫名其妙的又多了一条数据。很是蛋疼啊。
实体类
public class DeviceViewControl
{
public int ID { get; set; } //控件ID
public DeviceView DeviceView { get; set; } //所在视图ID
public DeviceSensorPoint DeviceSensorPoint { get; set; } //对应感控点ID
public string ViewControlClassName { get; set; } //控件类名称
public string ViewControlPosition { get; set; } //控件位置
public string Remark { get; set; } //备注
}
实体类1(主键表)
public class DeviceView
{
public Device deviceID { get; set; } //所属设备ID
public int ID { get; set; } //视图ID
public string Code { get; set; } //视图编码
public string viewName { get; set; } //视图类名称
}
实体类2(外键表)
public class DeviceSensorPoint
{
public int ID { get; set; }
public Device deviceID { get; set; } //设备ID
public string EnglishName { get; set; } //感控点名称(英文)
public string OldEnglishName { get; set; } //原有感控点名称(英文)
public string ChineseName { get; set; } //中文感控点名称
public string ValueType { get; set; } //数据类型(Analog/Switch)
public Nullable<bool> Readable { get; set; } //是否可读
public Nullable<bool> Writeable { get; set; } //是否可写
public Nullable<decimal> RecommandValue { get; set; } //推荐值
public Nullable<decimal> WriteValue { get; set; } //写入值
public Nullable<bool> IsWriten { get; set; } //是否写入
public Nullable<int> PLCReadChannelNo { get; set; } //读通道号
public Nullable<int> PLCWriteChannelNo { get; set; } //写通道号
public string SwitchNameOfTrue { get; set; } //开关量True代表的含义
public string SwitchNameOfFalse { get; set; } //开关量False代表的含义
public Nullable<decimal> MaxValue { get; set; } //量程上限
public Nullable<decimal> MinValue { get; set; } //量程下限
public bool IsAlarmNeeded { get; set; } //是否开启报警
public string Unit { get; set; } //计量单位
public Nullable<decimal> AlarmUpperValue { get; set; } //报警上限
public Nullable<decimal> AlarmLowerValue { get; set; } //报警下限
public string AlarmUpperInfo { get; set; } //报警上限提示信息
public string AlarmLowerInfo { get; set; } //报警下限提示信息
public string Remark { get; set; } //备注
public Nullable<decimal> CurrentValue { get; set; }
}
实体类3(外键表)
实现方法:
原来实现的是直接把ID(外键关联)赋予外键,但是发现这样是不行的。会出现开篇时候所说的效果。就想了如下解决办法。
[HttpPost]
public ActionResult Edit(string deviceViewCode, DAL.DeviceViewControl deviceViewControl,int Id)
{
if (!ModelState.IsValid)
{
if (string.IsNullOrEmpty(deviceViewControl.ViewControlClassName))
{
ModelState.AddModelError("ViewControlClassName", "请输入控件类名");
}
} //获取视图
var deviceView = this.db.DeviceViews.Where(p => p.Code == deviceViewCode).FirstOrDefault(); //获取感控点
var deviceSeneorPoint = db.DeviceSensorPoints.Where(p => p.ID == deviceViewControl.DeviceSensorPoint.ID).FirstOrDefault(); //获取控件
var deviceControl = db.DeviceViewControls.Where(p => p.ID == Id).FirstOrDefault();
deviceControl.Remark = deviceViewControl.Remark;
deviceControl.ViewControlClassName = deviceViewControl.ViewControlClassName;
deviceControl.DeviceSensorPoint = deviceSeneorPoint;
this.db.SaveChanges(); return RedirectToAction("List", new { deviceViewCode = deviceViewCode });
}
实现编辑
解决办法:就是先获取外键表的实体,将实体数据赋予要编辑表的外键。这样的话,实现主外键关联。真正实现编辑,而不是编辑变添加。
Entity FrameWork对有外键关联的数据表的添加操作的更多相关文章
- SQLSERVER清空(Truncate)被外键引用的数据表
前言:我们知道SQLSERVER清空数据表有两种方式Delete和Truncate,当然两者的不同大家也都知道(不清楚的可以MSDN).不过这个错误“Cannot truncate table be ...
- MySQL:如何导入导出数据表和如何清空有外建关联的数据表
1.导入导出 导入数据库:前提:数据库和数据表要存在(已经被创建) (1)将数据表 test_user.sql 导入到test 数据库的test_user 表中 [root@test ~]# mysq ...
- Entity Framework 更新带外键的实体为null
using (var ctx = new PortalContext()){ var city = ctx.Cities.Find(42); ctx.Entry(city) ...
- Rails中关联数据表的添加操作(嵌套表单)
很早就听说有Web敏捷开发这回事,最近终于闲了下来,可以利用业余的时间学些新东西,入眼的第一个东东自然是Ruby on Rails.Rails中的核心要素也就是MVC.ORM这些了,因此关于Rails ...
- 《Entity Framework 6 Recipes》中文翻译系列 (29) ------ 第五章 加载实体和导航属性之过滤预先加载的实体集合和修改外键关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-13 过滤预先加载的实体集合 问题 你想过滤预先加载的实体集合,另外,你想使用 ...
- Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)
有一个东西一直在我脑海中是个很烦的东西,但是这东西不搞清楚会阻碍自己的前进.自己做项目demo永远只能用一张表... 所以今天还是学习了下外键希望能够搞明白一些... 百度上搜索外键的作用" ...
- mysql 外键关联
mysql 外键关联 什么是外键:外键是一个特殊的索引,用于关联两个表,只能是指定内容. 如我将新建一个daka的表,然后将此表的class_id 与另外一个class的表的cid字段关联 class ...
- sql操作数据库(3)-->外键约束、数据库表之间的关系、三大范式、多表查询、事务
外键约束 在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名) 在已有表中添加外键约束:alter t ...
- 【MySQL】MySQL进阶(外键约束、多表查询、视图、备份与恢复)
约束 外键约束 外键约束概念 让表和表之间产生关系,从而保证数据的准确性! 建表时添加外键约束 为什么要有外键约束 -- 创建db2数据库 CREATE DATABASE db2; -- 使用db2数 ...
随机推荐
- ActiveMQ 即时通讯服务——浅析
一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provide ...
- html5学习小结,float练习。
经过两天的H5学习之后,做了一下float属性的练习,要做出来的效果为: 下面为代码部分,所用到的知识不多,不过才现在刚开始,以后要学的东西还有很多,大家继续加油! <!DOCTYPE html ...
- 所有设备的CSS像素
mydevice.io Mobile devices, in Responsive Web Design, relate to a core value which is the value of C ...
- github上怎么预览页面
直接在 http://htmlpreview.github.io/? 后面加上git上的地址就可以预览了 比如 http://htmlpreview.github.io/?https://github ...
- C++类内存分布
http://www.cnblogs.com/jerry19880126/p/3616999.html#undefined 书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看 ...
- Android课程---布局管理器之相对布局(二)
这次示例代码是相对布局中兄弟组件之间,设置按钮的位置,难度:*****,一定要注意有同方向和反方向之分: 1.同方向 1)layout_alignLeft 同方向左对齐 2)layout_alignR ...
- GDC2016 [全境封锁],11个种类5个派系的敌人设计思路
[汤姆克兰西:全境封锁],11个种类5个派系的敌人设计思路 实现[汤姆克兰西]射击RPG的AI开发 日文链接:http://game.watch.impress.co.jp/docs/news/2 ...
- 类似网易新闻 title栏 滚动时 文字放大&变色
http://files.cnblogs.com/files/n1ckyxu/ScrollTitleView.zip
- Day2(2016/1/22)——Testing
Activity Button,Toast,Finish 显式intent 隐式明天再看…… 感觉要先补一补java……
- ant build utf-8
使用Ant编译过程中,报error: unmappable character for encoding UTF8 最简单的方法是在Build.xml文件中,在所有出现Javac的地方,增加一个选项: ...