今天在编写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出错案例之一:主外键映射失败的更多相关文章

  1. netcore2.0 ORM框架中如何配置自定义的主外键加载

    环境:netcore2.0 DB :mysql ORM:Ant https://github.com/yuzd/AntData.ORM/tree/netcore2 [给我一个star吧] NUGET: ...

  2. Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

    1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...

  3. hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

    基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化 ...

  4. Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射

                                                        Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...

  5. 经典SQL语句大全_主外键_约束

    一.基础(建表.建约束.关系) 约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完整 ...

  6. Hibernate(八):基于外键映射的1-1关联关系

    背景: 一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联. 在hibernate代码开发中,实现这个业务有两种方案: 1)基于外键映射的1-1关联: 2)基于主键映射的1-1 ...

  7. EntityFramework Core 迁移忽略主外键关系

    前言 本文来源于一位公众号童鞋私信我的问题,在我若加思索后给出了其中一种方案,在此之前我也思考过这个问题,借此机会我稍微看了下,目前能够想到的也只是本文所述方案. 为何要忽略主外键关系 我们不仅疑惑为 ...

  8. Android Ormlite 学习笔记2 -- 主外键关系

    以上一篇为例子,进行主外键的查询 定义Users.java 和 Role.java Users -- Role 关系为:1对1 即父表关系 Role -- Users 关系为:1对多 即子表关系 下面 ...

  9. 数据库的SQL语句创建和主外键删除操作

    create table UserType ( Id ,), Name nvarchar() not null ) go create table UserInfo ( Id ,), LoginPwd ...

随机推荐

  1. 第一次开发PHP网页Hello PHP

    打开安装好的XAMPP的三个服务: 然后打开phpStorm,在Open选项选择文件目录(最后一个目录是htdocs)打开: 3.有时候可能无法修改php文件,会弹出一些提示窗口.那么就打开Finde ...

  2. Openstack python api 学习文档 api创建虚拟机

    Openstack python api 学习文档 转载请注明http://www.cnblogs.com/juandx/p/4953191.html 因为需要学习使用api接口调用openstack ...

  3. Effective Java 13 Minimize the accessibility of classes and members

    Information hiding is important for many reasons, most of which stem from the fact that it decouples ...

  4. 【转】PaxosLease算法--2PC看Paxos选主

    原文请参考[[置顶] Paxos master选举--PaxosLease算法] 众所周知,为了避免Paxos算法的活锁问题,必须选举唯一的proposor.偏偏在Paxos原论文中,作者L. Lam ...

  5. 【API】短信通106端口验证短信的实现

    信息时代,无论是电商还是网络营(chuan)销(xiao)都希望得道更多的用户信息.所以很多的网站注册上用到了手机验证码功能.网上有很多的SMS接口提供商.在选择的时候无非就是考虑到1.发送速度:2. ...

  6. docker-4 Dockerfile的使用

    Dockerfile FROM      基础镜像 MAINTAINER  维护这信息 RUN       运行什么命令,在命令前面加上RUN ADD       往里面加点文件,copy文件,会自动 ...

  7. 问题解决——VS2010 将生成的文件复制到指定位置

    我是从VC6直接过渡到VS2010的,VS2008没怎么用过.用VS2010的时候,每次生成dll后,手工把dll.lib..h文件复制到指定文件夹太麻烦了,所以着手写了这个. =========== ...

  8. nyoj 42 一笔画问题 欧拉路径

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=42 欧拉回路,欧拉路径水题~ 代码: #include "stdio.h&quo ...

  9. [转载] Android Metro风格的Launcher开发系列第一篇

    前言:从毕业到现在已经三年多了,回忆一下这三年基本上没有写过博客,总是觉得忙,没时间写,也觉得写博客没什么大用.但是看到很多大牛们都在写博客,分享自己的东西,所以嘛本着向大牛看齐,分享第一,记录第二的 ...

  10. 使用EntityFramework6完成增删查改和事务

    使用EntityFramework6完成增删查改和事务 上一节我们已经学习了如何使用EF连接数据库,并简单演示了一下如何使用EF6对数据库进行操作,这一节我来详细讲解一下. 使用EF对数据库进行操作, ...