EF 外键问题
在做一个评论功能的时候,发现用户的id不对,打开数据库一看,莫名其妙的新增了几个用户。明显是将外键中的用户新增到用户表中了。

评论表:

public class CourseComment : BaseModel
{
public string Content { get; set; } [ForeignKey("UserId")]
public virtual User FormUser { get; set; } public virtual int UserId { get; set; } public virtual CourseComment ReplayComment { get; set; } /// <summary>
/// 父组
/// </summary>
public int CourseId { get; set; } [Required]
[ForeignKey("CourseId")]
public virtual Course Course { get; set; } }
var user = GetUserById(id);
var com = new CourseComent() { Content = comment, CourseId = id, FormUser = user };
_comRepository.Add(com);
//add
public bool Add(CourseComent comment)
{
if (comment == null || string.IsNullOrEmpty(comment.Content)) return false;
_db.CourseComents.Add(comment);
_db.SaveChanges();
return true;
}
而原因就是user和comment不是在一个上下文中。 修改一下add方法:
public bool Add(CourseComent comment)
{
if (comment == null || string.IsNullOrEmpty(comment.Content)) return false; var u = _db.Users.Find(comment.FormUser.Id);
comment.FormUser = u;
_db.CourseComents.Add(comment);
_db.SaveChanges();
return true;
}
这个时候添加 就不会出现新增了。我们也可以看到两个对象的哈希值是不一样的。

我曾试图重写对象的对比方法和GetHashGode方法,让这两个值一样只要是id相同的话。但EF还是不识别,不知道它判断的对象的方法是什么。在有外键的操作中,一定要保持在同一个上下文中,也是同一个db对象下。
但是,上面的写法让人不舒服,要取出来再赋值一次,其实只用赋值Id就行了。
model.UserId = GetCurrentUser().Id;
另外,一个对象有两个以上的外键的时候,会报错,这个时候要取消级联删除。保留一个外键级联删除就行。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasMany(t => t.Notes).WithRequired(p => p.User).WillCascadeOnDelete(false); base.OnModelCreating(modelBuilder);
}
EF 外键问题的更多相关文章
- EF 外键不显示、如何让外键显示!增、删、改 操作时,外键不显示,只显示导航属性!
一.问题描述:EF 外键不显示.如何让外键显示!增.删.改 操作时,外键不显示,只显示导航属性! EF 添加.增加.插入数据时,外键不显示! 二.解决方案:在根据数据库生成模型的时候,选中“在模型中” ...
- EF外键关联
客户里面存在客服外键 基类模型 public class ModelBase { public ModelBase() { CreateTime = DateTime.Now; } [Key] pub ...
- EF外键保存数据
using (DataContext dbcontext=new DataContext ()) { //emp.department.ID = dep.ID; //emp.department = ...
- EF Code First 主键对应多个外键
这是一位朋友提出的疑问,EF 映射主键可以对应多个外键吗?如果外键设置级联删除会发生什么情况?下面做一个测试,示例实体代码: public class Blog { public Blog() { P ...
- 基于EF的数据外键关联查询
现在很多ORM不自带外键关联的实体查询,比如我查询用户,用时将关联的角色信息查询出来,那么就要进行2次查询,很麻烦.而我现在要做的就是基于EF的外键关联查询.很方便的. 首先,创建基础查询的BaseS ...
- EF中主表和附表一起提交的话,如果主附表的主键外键已经设定。
EF中主表和附表一起提交的话,如果主附表的主键外键已经设定,如果新增同时新增主表和附表的记录,那么在EF同时提交时,不需要人为的设定附表的主表的主键值,EF会自动为附表添加外键值.
- EF如何操作内存中的数据和加载外键数据:延迟加载、贪婪加载、显示加载
EF如何操作内存中的数据和加载外键数据:延迟加载.贪婪加载.显示加载 之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需 ...
- EF Code First中的主外键约定和一对一、一对多关系的实现
对于主外键约定的理解,其实是学习实体间一对一和一对多关系的基础. 1.1 主键(Key)约定 主键的默认约定是:只要字段名为--实体名(类名)+"id"(不区分大小写),这就算是默 ...
- ef core的外键约束笔记
ef core设置可选外键,有如下几种方式:1.在依赖实体AAA中,并不显式设置外键属性XXXId 2.手动设置外键属性XXXId为可空类型(int?等类型) 3.在实体类与数据表进行映射时,配置狭隘 ...
随机推荐
- 《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市
<Linux 多线程服务端编程:使用 muduo C++ 网络库> 电子版已在京东和亚马逊上市销售. 京东购买地址:http://e.jd.com/30149978.html 亚马逊Kin ...
- echarts绘制甘特图
在setoption之后添加这段代码: window.addEventListener('resize', function () { myChart.resize(); }); 图表就能随着 ...
- 来自MarsEdit的博客测试
使用MarsEdit编辑的第一个测试博客. 希望我们一帆风顺! 插图,在插图时可以调整尺寸: 六种公式写法,记得要在选项中打开-启用数学公式: \begin{equation}\sum\end{e ...
- Windows XP发行12周年,我正步入中年,你已垂暮
2001年10月25日,Windows XP正式全球上市!作为Windows 2000的升级版本,XP拥有大量新的功能:新的用户界面.防火墙整合等,这些都大大的增强了系统的易用性和安全性.而微软将于2 ...
- KMP详解
原文: http://blog.csdn.net/v_july_v/article/details/7041827 从头到尾彻底理解KMP 1. 引言 本KMP原文最初写于2年多前的2011年12月, ...
- 用Asp.net写自己的服务框架
阅读目录 开始 理解Asp.net管线 HttpHandler HttpModule 关于Content-Encoding的解释 选 HttpHandler 还是 HttpModule ? 看不见的性 ...
- sqlserver开启'xp_cmdshell'命令
--sql server中开启xp_cmdshell命令 1. --允许配置高级选项 GO RECONFIGURE GO . --开启xp_cmdshell服务 RECONFIGURE GO . -- ...
- 为什么LTE系统的最小时间单位是Ts?
之前一直在做LTE物理层相关的工作,一直有个疑惑, 在36.211开头的一章定义Ts的大小是1/(15000*2048)s,为什么定义这么一个奇怪的unit time. 最近才反应过来,这跟FFT/I ...
- visual studio 2005 常用按键
VS2005 实用快捷键,迅速提高代码编写效率! 代码快捷键 Ctrl+J / Ctrl+K,L 列出成员 Ctrl+Shift+空格键 / Ctrl+K,P 参数信息 Ctrl+ ...
- linux系统启动时更改MAC地址
vim /etc/rc.local #change the server's MAC address("00:50:56:84:5C:76" change to 00:50:56: ...