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对象下。

时间: 2024-10-20 20:08:50

EF 外键问题的相关文章

EF外键关联

客户里面存在客服外键 基类模型 public class ModelBase { public ModelBase() { CreateTime = DateTime.Now; } [Key] public virtual int ID { get; set; } public virtual DateTime CreateTime { get; set; } } 客服模型 [Table("CustomerServer")] public partial class CustomerS

EF外键添加

关于外键添加,直接使用赋值的方式. public partial class YXTDemand : FullAuditedEntity<int, User> { public virtual YXTOrigin Origin { get; set; } } public partial class YXTOrigin : FullAuditedEntity<int, User> { public virtual ICollection<YXTDemand> YXTDe

8. EF Core 外键的删除模式

一.在删除有其它表的外键引用的数据有一下几种方式 1.不执行任何操作(EF Core默认Restrict):如果数据被其其他表外键依赖,拒绝删除 2.级联(Cascade):删除外键表中相应的所有行 3.设置NULL(SetNull):将表的外键字段值设置为空值NULL 4.设置默认值:如果外键表的所有外键列均已定义默认值,则将该列设置为默认值 级联删除例子 modelBuilder.Entity<Post>().HasOne(p => p.Blog).WithMany(b =>

EF Code First 导航属性 与外键

一对多关系 项目中最常用到的就是一对多关系了.Code First对一对多关系也有着很好的支持.很多情况下我们都不需要特意的去配置,Code First就能通过一些引用属性.导航属性等检测到模型之间的关系,自动为我们生成外键.观察下面的类: public class Destination { public int DestinationId { get; set; } public string Name { get; set; } public string Country { get; s

基于EF的外键的查询 使用【ForeignKey(“ SupplierId”】特性

//实体模型类: /// 供应商id /// </summary> public Guid? SupplierId { get; set; } /// <summary> /// SupplierId—是该表的外键 是DB_Supplier表的主键 /// DB_Supplier 表名 /// </summary> [ForeignKey("SupplierId")] public virtual DB_Supplier Supplier { get

ASP.NET EF实体主外键关系

主键.外键 需要删除完外键表才能删除主键表 一对一关系people表public Table table{get;set;}//当前为主键表 identity表//不需要设置 一对多关系 order表 public ICollection<orderDetail> orderDetail{get;set;}//包含关系,当前为主键表 orderDetail表 public virtual order{get;set;}//外键表 原文地址:https://www.cnblogs.com/Uyd

EF之Code First设置主外键关系(一)

指定类外键有注释(DataAnnotation)和FluentAPI两种方式,下面我们主要使用DataAnnotation指定外键关系 第一种方式 //1-指定导航属性,会自动生成外键,命名规则为:“对象名称_主键名” public class TUsers { [Key] public int UserId { get; set; } public string Account { get; set; } public string Password { get; set; } public

datagrid显示外键对象

在显示数据列表时,会遇到外键的处理情况,比如,显示文章列表时,我们还要显示文章的分类,而文章分类在文章表中是以外键出现的. 1.View <div style="width:100%;height:100%;">    <table class="easyui-datagrid" id="datagridArtic" style="width: 100%; height: 95%;" data-options

EF之外键Include() left join

项目中用EF实现外键查询出的数据, 查询数量正确, 但实现返回数据集数量不对 //DbContext.cs HasRequired(s => s.ClassRoom) .WithMany() .HasForeignKey(student => student.ClassRoomId); //查询语句 dbRead.Set<Student>().Include(x=>x.ClassRoom); 查询 .Count()和.ToList()结果数量不一致 经调试后发现生成的Sql语