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 ...
随机推荐
- 测试管理_出色测试管理者的思考[持续更新ing]
如何合理安排并按质按量按时完成每一个测试任务,做好项目管理? 如何把控到每一个测试任务的质量? 如何快速构建和构建好测试环境? 如何获取或快速制作测试数据? 如何确保每一个测试人员的工作都饱满? 如何 ...
- C# 图片处理(压缩、剪裁,转换,优化)
1.图片与二进制的转换 图片转换成二进制主要用于数据库存储及图片数据的应用间传输,如网站服务器通过WebService或WCF从数据处理服务器获取图片数据,就可以以二进制形式传输 ///图片转二进制 ...
- device eth0 does not seem to be present, delaying initialization
在搭建LVS+Keepalived高可用负载均衡环境的过程中,使用VirtualBox复制了两个Centos的环境,并且选中了“重新初始化网卡”的选项,但是在启动这两个复制的Centos环境的时候,发 ...
- 详细的图文教程来实现 eclipse环境下如何配置tomcat,并且把项目部署到Tomcat服务器上
很多初学,尤其自学JavaWeb的朋友首次在eclipse下配置tomcat时,总会有种难下手的感觉,在此,通过图文解说的方法,最直观的向大家演示一遍该配置过程. 第一部分:eclipse环境下如何配 ...
- Android 渗透测试学习手册 翻译完成!
原书:Learning Pentesting for Android Devices 译者:飞龙 在线阅读 PDF格式 EPUB格式 MOBI格式 代码仓库 赞助我 协议 CC BY-NC-SA 4. ...
- Cinder 调试 - cinder service 状态为 down
1. 问题 我们经常会发现某个cinder service 的状态为 down.比如下面例子中 controller 上的 cinder-scheduler 和 block1 节点上 cinder-v ...
- DAC使用基本准则
DAC Nyquist Zones, Zero Order Hold, and Images why do the Fout images exist in every Nyquist zone? W ...
- Fisker大师用ZBrush制作兽人萨尔全过程
十二年前,暴雪推出第一款网络游戏<魔兽世界>,以迅雷不及掩耳盗铃之势风靡全球:十二年后,魔兽终于改编成大电影,同样掀起了一场巨大的风暴, 接二连三打破了多项票房纪录.纵观游戏史,很难找出一 ...
- 怎样快速免费获取Windows版本的ZBrush
ZBrush是一款专业的3D绘制软件及数字雕刻软件,随着3D技术的不断进步,ZBrush也是越来越受到业内欢迎,在世界拥有了众多的粉丝和爱好者.相信很多用户对软件的体验就是从使用的版本开始的,本文就教 ...
- 如何实现ZBrush中的Alt和Shift键的快速运用
ZBrush是一个数字雕刻和绘画软件,它以强大的功能和直观的工作流程彻底改变了整个三维雕刻行业.在一个简洁的界面中,ZBrush®为当代数字艺术家提供了世界上最先进的工具.利用快捷键能使操作更快捷高效 ...