MVC出错案例之一:主外键映射失败
今天在编写DomainModel和DomainMapper,最后放到OnModelCreating中运行的时候,给我抛出了如下错误:
One or more validation errors were detected during model generation: TinyFrame.Data.DataContext.t_expert_content_ExpertType: : Multiplicity conflicts with the referential constraint in Role 't_expert_content_ExpertType_Target' in relationship 't_expert_content_ExpertType'. Because all of the properties in the Dependent Role are non-nullable, multiplicity of the Principal Role must be '1'.
排查了一会儿找到了原因所在。
请看我的Model:
public class t_expert_content
{
public string ID { get; set; } //PK
public string TypeID { get; set; } public string Name { get; set; } //问题标题
public string Publisher { get; set; } //发布人
public int? Count { get; set; } //查看次数
public bool IsCheck { get; set; } //是否审核
public DateTime PublishDate { get; set; } //发布时间 public string Content { get; set; }
public int? Order { get; set; } public virtual t_expert_type ExpertType { get; set; }
}
然后是ModelMapper:
public class t_expert_content_mapper : EntityTypeConfiguration<t_expert_content>
{
public t_expert_content_mapper()
{
this.ToTable("t_expert_content"); this.HasKey(x => x.ID);
this.Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
this.Property(x => x.ID).HasMaxLength(36); this.Property(x => x.TypeID).IsRequired().HasMaxLength(36);
this.Property(x => x.Name).IsRequired().HasMaxLength(500);
this.Property(x => x.Publisher).IsOptional().HasMaxLength(150);
this.Property(x => x.Count).IsOptional();
this.Property(x => x.IsCheck).IsRequired();
this.Property(x => x.PublishDate).IsRequired();
this.Property(x => x.Content).IsOptional().HasColumnType("text");
this.Property(x => x.Order).IsOptional(); this.HasOptional(x => x.ExpertType)
.WithMany()
.HasForeignKey(x => x.TypeID)
.WillCascadeOnDelete(false);
}
}
看上去没啥问题,但是问题就出在外键映射上面。
由于t_expert_content的外键TypeID 是t_expert_type表中的主键ID。由于我在映射的时候,写的是:
this.Property(x => x.TypeID).IsRequired().HasMaxLength(36);
而在下面进行导航属性指定的时候,ExpertType被指定成了HasOptional类型的:
this.HasOptional(x => x.ExpertType)
.WithMany()
.HasForeignKey(x => x.TypeID)
.WillCascadeOnDelete(false);
导致二者产生了冲突,抛出了开头的错误。
知道了原因,解决方法就好办了:
public class t_expert_content_mapper : EntityTypeConfiguration<t_expert_content>
{
public t_expert_content_mapper()
{
this.ToTable("t_expert_content"); this.HasKey(x => x.ID);
this.Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
this.Property(x => x.ID).HasMaxLength(36); //this.Property(x => x.TypeID).IsRequired().HasMaxLength(36);
this.Property(x => x.Name).IsRequired().HasMaxLength(500);
this.Property(x => x.Publisher).IsOptional().HasMaxLength(150);
this.Property(x => x.Count).IsOptional();
this.Property(x => x.IsCheck).IsRequired();
this.Property(x => x.PublishDate).IsRequired();
this.Property(x => x.Content).IsOptional().HasColumnType("text");
this.Property(x => x.Order).IsOptional(); this.HasRequired(x => x.ExpertType)
.WithMany()
.HasForeignKey(x => x.TypeID)
.WillCascadeOnDelete(false);
}
}
需要说明的是,上面代码中的:
this.Property(x => x.TypeID).IsRequired().HasMaxLength(36);
可以选择注释,也可以选择不注释。
MVC出错案例之一:主外键映射失败的更多相关文章
- netcore2.0 ORM框架中如何配置自定义的主外键加载
环境:netcore2.0 DB :mysql ORM:Ant https://github.com/yuzd/AntData.ORM/tree/netcore2 [给我一个star吧] NUGET: ...
- Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...
- hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同
基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化 ...
- Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射
Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...
- 经典SQL语句大全_主外键_约束
一.基础(建表.建约束.关系) 约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完整 ...
- Hibernate(八):基于外键映射的1-1关联关系
背景: 一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联. 在hibernate代码开发中,实现这个业务有两种方案: 1)基于外键映射的1-1关联: 2)基于主键映射的1-1 ...
- EntityFramework Core 迁移忽略主外键关系
前言 本文来源于一位公众号童鞋私信我的问题,在我若加思索后给出了其中一种方案,在此之前我也思考过这个问题,借此机会我稍微看了下,目前能够想到的也只是本文所述方案. 为何要忽略主外键关系 我们不仅疑惑为 ...
- Android Ormlite 学习笔记2 -- 主外键关系
以上一篇为例子,进行主外键的查询 定义Users.java 和 Role.java Users -- Role 关系为:1对1 即父表关系 Role -- Users 关系为:1对多 即子表关系 下面 ...
- 数据库的SQL语句创建和主外键删除操作
create table UserType ( Id ,), Name nvarchar() not null ) go create table UserInfo ( Id ,), LoginPwd ...
随机推荐
- iOS多线程-01-pthread与NSTread
简介 恰当的使用多线程编程可以提供任务的执行效率和系统资源的利用率 多线程是为了提高资源利用率,和应用程序的响应速度,多个线程共享应用资源 每个应用程序都有一个主线程,通常用来做UI界面刷新等 比较耗 ...
- PHP错误日志控制(display_errors和error_reporting)
display_errors和error_reporting是php程序调试过程中两个非常重要的参数,下面就来介绍一下这两个错误日志的配置如何开启和关闭: 我们知道在产品的生产环境肯定是不能够显示错误 ...
- JSON转换类(一)--过滤特殊字符,格式化字符型、日期型、布尔型
/// <summary> /// 过滤特殊字符 /// </summary> private static string String2Json(String s) { St ...
- 删除CListCtrl中具有某一相同数据的所有行
删除CListCtrl中具有某一相同数据的所有行 ================================== 本文原创,转载请注明出处:http://blog.csdn.net/wlsgzl ...
- 使用Spring整合Hibernate,并实现对数据表的增、删、改、查的功能
1.1 问题 使用Spring整合Hibernate,并实现资费表的增.删.改.查. 1.2 方案 Spring整合Hibernate的步骤: 1.3 步骤 实现此案例需要按照如下步骤进行. 采用的环 ...
- 基于注解配置的Spring MVC 简单的HelloWorld实例应用
2.1 问题 使用注解的方式重构helloworld应用案例. 2.2 方案 1. @RequestMapping注解应用 @RequestMapping可以用在类定义和方法定义上,它标明这个类或方法 ...
- 记一次Web应用CPU偏高
LZ开发的一个公司内部应用供查询HIVE数据使用.部署上线后总是会出现CPU偏高的情况,而且本地测试很难重现.之前出现几次都是通过直接重启后继续使用,因为是内部使用,重启一下也没有很大影响(当然,每次 ...
- uva 12655 Trucks [LCA](树链剖分+MST)
The Subtle Balloons Company (SBC) is the main balloon provider for programming contests; it hashuge ...
- Linux 环境下如何使 Chrome 浏览器字体更漂亮
Windows 就免谈了,本身字体渲染技术 Cleartype 以及 DirectWrite 就稀烂得一塌糊涂.Mac 下面本来字体渲染就很好,所以关键就是在 Linux 下如何使 Chrome 的字 ...
- Centos 6.5(64bit)上安装Vertica single node
在Win8上使用虚拟机Virtualbox安装Centos6.5,想在上面安装vertica. 以下记录了我在安装的过程中遇到的问题与一些解决方案. 1.安装Centos的时候遇到了一个恼人的问题,即 ...