问题描述 :

数据库中有两张表,如下:

Member(会员)表有外键RoleId,对应的是Role(角色)表的主键Id,业务逻辑是Member表的RoleId必须与Role表的Id对应(但在设计数据表时没有设置外键,使用EF(Entity Framework,下同)来配置)

首页Member的代码如下:

    public partial class Member
{
public int Id { get; set; } public string Name { get; set; } public string Password { get; set; } public bool Delete{ get; set; } public int RoleId { get; set; } public virtual Role Role { get; set; }
}

Role表的代码如下:

    public partial class Role
{
public int Id { get; set; } public string Name { get; set; } public virtual IList<Member> Members { get; set; }
}

Member、Role的关系代码如下:

public class MemberMap : EntityTypeConfiguration<Member>
{
public MemberMap()
{
this.ToTable("Member");
this.HasKey(m => m.Id);
this.HasRequired(m => m.Role).WithMany().HasForeignKey(m => m.RoleId);
}
}
    public class RoleMap: EntityTypeConfiguration<Role>
{
public RoleMap()
{
this.ToTable("Role");
this.HasKey(r => r.Id);
}
}

EF操作类如下:

public partial class EFContext<T> : DbContext where T : class
{
public EFContext(): base("name=MyConnectionString")
{
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<EFContext<T>> (null);
modelBuilder.Configurations.Add(new MemberMap());
modelBuilder.Configurations.Add(new RoleMap());
base.OnModelCreating(modelBuilder);
} public DbSet<T> Table { get; set; } public IQueryable<T> GetList(Expression<Func<T,bool>> where)
{
return this.Table.Where(where);
}
}

程序运行时提示异常,

展开详情信息如下:

使用SQL Profiler发现生成的代码如下:

这里多查询了Role_Id,实际RoleId已经是外键了。

解决方法是WithMany()配置映射,即修改MemberMap为如下:

public class MemberMap : EntityTypeConfiguration<Member>
{
public MemberMap()
{
this.ToTable("Member");
this.HasKey(m => m.Id);
this.HasRequired(m => m.Role).WithMany(r => r.Members).HasForeignKey(m => m.RoleId);
}
}

此时再运行控制台程序,没有异常,SQL Profiler如下:

可能有人会问,如果确实在MemberMap中使用WithMany()而不是WithMany(r=>r.Members)呢?

此时修改方式如下:

注释或删除Role实体代码中的Members属性

public partial class Role
{
public int Id { get; set; } public string Name { get; set; } //public virtual IList<Member> Members { get; set; }
}

修改MemberMap为上面所述的:

public class MemberMap : EntityTypeConfiguration<Member>
{
public MemberMap()
{
this.ToTable("Member");
this.HasKey(m => m.Id);
this.HasRequired(m => m.Role).WithMany().HasForeignKey(m => m.RoleId);
}
}

最后重新运行程序,没有异常

关于Entity Framework关系配置,提示列名XXXX_Id无效的问题的更多相关文章

  1. Entity Framework 关系约束配置

    前言 简单的说一下自己的理解,大家应该都很明白ADO.NET,也就是原生态的数据库操作,直接通过拼接SQL语句,表与表之间通过链接(inner join  left join  或者子查询),也就是在 ...

  2. MS SQL提示列名 'Y' 无效的原因及解决办法

    在作项目写MS SQL 存储过程时,需拼接SQL语句字符串,其中有单字符变量,如下图: 如上图执行存储过程是提示“列名‘Y’无效”.经反复测试,原因在用单字符变量连接SQL字符串是必须在引用变量前后各 ...

  3. 分享使用Entity Framework的一个坑:Include无效

    如果不想延迟加载,可以通过设置:context.Configuration.LazyLoadingEnabled = false;或查询时加上AsNoTracking()方法即可. 如果不想生成代理, ...

  4. .Net Entity Framework Core 用 HasColumnType 配置浮点数精度

    一.前言 前段时间用.Net Entity Framework core搭建框架,需要配置浮点数的精度,发现.Net Entity Framework core 并没有HasPrecision方法.在 ...

  5. Entity Framework Code First数据库连接

    1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器->程序包管理器控制台,执行以下语句: PM> Insta ...

  6. Entity Framework 5.0系列之Code First数据库迁移

    我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...

  7. Entity Framework浅析

    1.Entity Framework简介 http://www.cnblogs.com/aehyok/p/3315991.html 2.Entity Framework DBFirst尝试http:/ ...

  8. Entity Framework 5.0基础系列

    1.Entity Framework简介 http://www.cnblogs.com/aehyok/p/3315991.html 2.Entity Framework DBFirst尝试http:/ ...

  9. Entity Framework Code First数据库连接 转载 https://www.cnblogs.com/libingql/p/3351275.html

    Entity Framework Code First数据库连接   1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器 ...

随机推荐

  1. 深入理解Java虚拟机:第2章 Java内存区域与内存溢出异常

    目录 2.2 运行时数据区域 Java堆 方法区 虚拟机栈 本地方法栈 程序计数器 2.3 HotSpot虚拟机对象探秘 对象的创建 对象的内存布局 对象的访问定位   2.2 运行时数据区域 Jav ...

  2. 原生JavaScript 导出excel表格(兼容ie和其他主流浏览器)

    因同事的需求是想前端导出excel表格,网上找了一些demo,自己修改了一下,可能以后会用到,记录下来吧,兼容ie和一些主流浏览器,ie可能会报错,原因参考 这里,edge 浏览器还没有办法导出,正在 ...

  3. 任务四十一:UI组件之日历组件(二)

    任务四十一:UI组件之日历组件(二) 面向人群: 有一定基础的同学 难度: 中 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质量以及学 ...

  4. [转]微信小程序之购物车功能

    本文转自:https://www.cnblogs.com/linxin/p/6834206.html 前言 以往的购物车,基本都是通过大量的 DOM 操作来实现.微信小程序其实跟 vue.js 的用法 ...

  5. angularjs 依赖注入原理与实现

    在用angular依赖注入时,感觉很好用,他的出现是 为了“削减计算机程序的耦合问题” ,我怀着敬畏与好奇的心情,轻轻的走进了angular源码,看看他到底是怎么实现的,我也想写个这么牛逼的功能.于是 ...

  6. BG.Hive - part3

    1. Hive数据导入 - Load Load,加载,不会进行任何数据转换和处理的操作,只会进行数据Move操作,将元数据移动到HDFS指定目录 a> hdfs dfs -put 'hdfs的h ...

  7. angularjs 从外部改变controller内的数据

    var appElement = document.querySelector('[ng-controller=seatsCtrl]'); var $scope = angular.element(a ...

  8. PHP 类与对象 全解析(三)

    目录 PHP 类与对象 全解析( 一) PHP 类与对象 全解析( 二) PHP 类与对象 全解析(三 ) 13.魔术方法 定义:PHP把所有以__(两个下划线)开头的类方法当成魔术方法     __ ...

  9. jsonp跨域简单应用(一)

    转载:http://www.cnblogs.com/cyg17173/p/5865364.html ashx+jsonp+document.referrer   -- 一年前学的JSONP 跨域,一年 ...

  10. 撩课-Web大前端每天5道面试题-Day20

    1.vue生命周期的作用是什么? 它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑. 2. Vue实现数据双向绑定的原理:Object.defineProperty( ...