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数 ...
随机推荐
- winform窗体最大化、最小化、还原
//最大化 private void button_maxsize_Click(object sender, EventArgs e) { this.WindowS ...
- 在XP下安装PHP
最近,有许多朋友问我在WindowsXp下PHP的安装过程,正好最近我在自己的机器上成功的以模块化的方式安装了PHP4.23.既然这么多朋友需要,我就以最常见的IIS和Apache服务器为例,把PHP ...
- 用c#实现$.now()(1437813924915)的时间效果
Convert.ToInt64((DateTime.UtcNow - Convert.ToDateTime("1970-01-01")).TotalMilliseconds)
- Sortable Observable Collection in C#
Sorting outside the collection protected override void OnNavigatedTo(NavigationEventArgs e) { if (Se ...
- VTK GetScalarPointer() and GetScalarComponentAsFloat() not work
I am using VTK 5.10.1 with VS 2010, and the following example does not work on my machine: http://ww ...
- hdu Prime Ring Problem
简单的dfs,貌似这道题用暴力枚举就可以了,毕竟数据开的是比较小的. #include"iostream" #include"algorithm" #inclu ...
- JAVA6开发WebService (一)
转载自http://wuhongyu.iteye.com/blog/807470 WebService是SOA的一种较好的实现方式,它将应用程序的不同功能单元通过中立的契约(独立于硬件平台.操作系统和 ...
- bzoj4518: [Sdoi2016]征途--斜率DP
题目大意:把一个数列分成m段,计算每段的和sum,求所有的sum的方差,使其最小. 由方差*m可以化简得ans=m*sigma(ki^2)-sum[n]^2 很容易得出f[i][j]=min{f[i- ...
- css 多行溢出
<div style=" height: 38px; max-width: 180px; -webkit-box-orient: vertical; word-break: break ...
- css 字体超出隐藏
height: 55px white-space: nowrap; overflow: hidden; text-overflow: ellipsis;