关于Entity Framework关系配置,提示列名XXXX_Id无效的问题
问题描述 :
数据库中有两张表,如下:

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无效的问题的更多相关文章
- Entity Framework 关系约束配置
前言 简单的说一下自己的理解,大家应该都很明白ADO.NET,也就是原生态的数据库操作,直接通过拼接SQL语句,表与表之间通过链接(inner join left join 或者子查询),也就是在 ...
- MS SQL提示列名 'Y' 无效的原因及解决办法
在作项目写MS SQL 存储过程时,需拼接SQL语句字符串,其中有单字符变量,如下图: 如上图执行存储过程是提示“列名‘Y’无效”.经反复测试,原因在用单字符变量连接SQL字符串是必须在引用变量前后各 ...
- 分享使用Entity Framework的一个坑:Include无效
如果不想延迟加载,可以通过设置:context.Configuration.LazyLoadingEnabled = false;或查询时加上AsNoTracking()方法即可. 如果不想生成代理, ...
- .Net Entity Framework Core 用 HasColumnType 配置浮点数精度
一.前言 前段时间用.Net Entity Framework core搭建框架,需要配置浮点数的精度,发现.Net Entity Framework core 并没有HasPrecision方法.在 ...
- Entity Framework Code First数据库连接
1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器->程序包管理器控制台,执行以下语句: PM> Insta ...
- Entity Framework 5.0系列之Code First数据库迁移
我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...
- Entity Framework浅析
1.Entity Framework简介 http://www.cnblogs.com/aehyok/p/3315991.html 2.Entity Framework DBFirst尝试http:/ ...
- Entity Framework 5.0基础系列
1.Entity Framework简介 http://www.cnblogs.com/aehyok/p/3315991.html 2.Entity Framework DBFirst尝试http:/ ...
- Entity Framework Code First数据库连接 转载 https://www.cnblogs.com/libingql/p/3351275.html
Entity Framework Code First数据库连接 1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器 ...
随机推荐
- Annotate类
在Annotate类中有个Annotator接口,定义如下: /** A client that has annotations to add registers an annotator, * th ...
- Android硬件抽象层(HAL)深入剖析(三)【转】
前面分析了android HAL层是如何搜索硬件模块的动态共享库的,其实就是在"system/lib/hw/"或者"/vendor/lib/hw/"这两个路径下 ...
- Idea 2017.3以后版本的破解(亲测有效)转
转自:http://www.mamicode.com/info-detail-2147137.html 自从升级到idea2017.3之后,之前的license server破解方法貌似已失效.于是找 ...
- java.lang 类String
方法摘要1 charcharAt(int index) 返回指定索引处的 char 值. index - char 值的索引.2 string concat( ...
- spring AOP 之四:@AspectJ切入点标识符语法详解
@AspectJ相关文章 <spring AOP 之二:@AspectJ注解的3种配置> <spring AOP 之三:使用@AspectJ定义切入点> <spring ...
- Spring Boot 不使用默认的 parent,改用自己的项目的 parent
在初学spring boot时,官方示例中,都是让我们继承一个spring的 spring-boot-starter-parent 这个parent: <parent> <group ...
- JDK动态代理[2]----JDK动态代理的底层实现之Proxy源码分析
在上一篇里为大家简单介绍了什么是代理模式?为什么要使用代理模式?并用例子演示了一下静态代理和动态代理的实现,分析了静态代理和动态代理各自的优缺点.在这一篇中笔者打算深入源码为大家剖析JDK动态代理实现 ...
- volatile特性
volatile保证可见性 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作的可见性,即一个线程修改了某个变量 ...
- 防止TableView 上的tap手势隔断 cell的选择
遵循UIGestureRecognizerDelegate协议: 1.0添加手势 - (void)addTapGest { UITapGestureRecognizer *tap = [[U ...
- 数据库连接池使用(一):使用C#数据库连接池
一.导读 使用C#数据库连接池,连接到数据库服务器通常由几个需要软长时间的步骤组成: 1.必须与服务器进行初次连接: 2.必须分析连接字符串信息: 3 ...