前天做了一个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对有外键关联的数据表的添加操作的更多相关文章

  1. SQLSERVER清空(Truncate)被外键引用的数据表

    前言:我们知道SQLSERVER清空数据表有两种方式Delete和Truncate,当然两者的不同大家也都知道(不清楚的可以MSDN).不过这个错误“Cannot truncate table  be ...

  2. MySQL:如何导入导出数据表和如何清空有外建关联的数据表

    1.导入导出 导入数据库:前提:数据库和数据表要存在(已经被创建) (1)将数据表 test_user.sql 导入到test 数据库的test_user 表中 [root@test ~]# mysq ...

  3. Entity Framework 更新带外键的实体为null

    using (var ctx = new PortalContext()){    var city = ctx.Cities.Find(42);    ctx.Entry(city)        ...

  4. Rails中关联数据表的添加操作(嵌套表单)

    很早就听说有Web敏捷开发这回事,最近终于闲了下来,可以利用业余的时间学些新东西,入眼的第一个东东自然是Ruby on Rails.Rails中的核心要素也就是MVC.ORM这些了,因此关于Rails ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (29) ------ 第五章 加载实体和导航属性之过滤预先加载的实体集合和修改外键关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-13  过滤预先加载的实体集合 问题 你想过滤预先加载的实体集合,另外,你想使用 ...

  6. Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)

    有一个东西一直在我脑海中是个很烦的东西,但是这东西不搞清楚会阻碍自己的前进.自己做项目demo永远只能用一张表... 所以今天还是学习了下外键希望能够搞明白一些... 百度上搜索外键的作用" ...

  7. mysql 外键关联

    mysql 外键关联 什么是外键:外键是一个特殊的索引,用于关联两个表,只能是指定内容. 如我将新建一个daka的表,然后将此表的class_id 与另外一个class的表的cid字段关联 class ...

  8. sql操作数据库(3)-->外键约束、数据库表之间的关系、三大范式、多表查询、事务

    外键约束 在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名) 在已有表中添加外键约束:alter t ...

  9. 【MySQL】MySQL进阶(外键约束、多表查询、视图、备份与恢复)

    约束 外键约束 外键约束概念 让表和表之间产生关系,从而保证数据的准确性! 建表时添加外键约束 为什么要有外键约束 -- 创建db2数据库 CREATE DATABASE db2; -- 使用db2数 ...

随机推荐

  1. jquery插件之文字间歇自动向上滚动

    该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的文字间歇向上滚动特效,当鼠标移动到文字上时,向上滚动会停 ...

  2. 用atom写LaTeX文档

    下载并安装Tex Live: 下载页面 下载并安装atom:下载页面 打开atom File -> Settings -> Install 搜索并安装: language-latex la ...

  3. html中隐藏域hidden的作用介绍及使用示例

    基本语法: <input type="hidden" name="field_name" value="value"> 作用:  ...

  4. Linux下配置Lamp

    linux下配置lamp步骤: 一.快速安装Apache+PHP5+MySql 先更新: # yum update 然后安装LAMP环境:(163的yum源上只有php5.1.6 mysql 5.0. ...

  5. zk 隐藏网页文件后缀

    前台(test.zul): <a label="隐藏地址" href="/Bandbox/test.html"/> web.xml添加 <se ...

  6. windows安装django

    Window 下安装 Django 如果你还未安装Python环境需要先下载Python安装包. 1.Python 下载地址:https://www.python.org/downloads/ 2.D ...

  7. Spring的quartz定时器同一时刻重复执行二次的问题解决

    最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候, ...

  8. javascript遍历数组最优写法

    var arr = [];//这样定义的数组,是null,等待开辟空间 var arr = new Array();//不建议使用,会占用一块内存空间 var i=0,len=arr.length; ...

  9. HDU1004之总是wa的细节问题

    #include <stdio.h> #include <string.h> int main() { ][]; int n, i, k, j, max, max_i; ){ ...

  10. 安装好php后,配置httpd以便支持php3脚本

    Apache是目前应用最广的Web服务器,PHP是一种类似ASP的易学的脚本语言,而且性能和功能都比ASP要强,而MySQL又是一个Linux上应用最多的数据库系统,特别是用于网站建设,这3个软件均是 ...