今天在编写DomainModel和DomainMapper,最后放到OnModelCreating中运行的时候,给我抛出了如下错误:

  1. One or more validation errors were detected during model generation:
  2.  
  3. 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:

  1. public class t_expert_content
  2. {
  3. public string ID { get; set; } //PK
  4. public string TypeID { get; set; }
  5.  
  6. public string Name { get; set; } //问题标题
  7. public string Publisher { get; set; } //发布人
  8. public int? Count { get; set; } //查看次数
  9. public bool IsCheck { get; set; } //是否审核
  10. public DateTime PublishDate { get; set; } //发布时间
  11.  
  12. public string Content { get; set; }
  13. public int? Order { get; set; }
  14.  
  15. public virtual t_expert_type ExpertType { get; set; }
  16. }

然后是ModelMapper:

  1. public class t_expert_content_mapper : EntityTypeConfiguration<t_expert_content>
  2. {
  3. public t_expert_content_mapper()
  4. {
  5. this.ToTable("t_expert_content");
  6.  
  7. this.HasKey(x => x.ID);
  8. this.Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
  9. this.Property(x => x.ID).HasMaxLength(36);
  10.  
  11. this.Property(x => x.TypeID).IsRequired().HasMaxLength(36);
  12. this.Property(x => x.Name).IsRequired().HasMaxLength(500);
  13. this.Property(x => x.Publisher).IsOptional().HasMaxLength(150);
  14. this.Property(x => x.Count).IsOptional();
  15. this.Property(x => x.IsCheck).IsRequired();
  16. this.Property(x => x.PublishDate).IsRequired();
  17. this.Property(x => x.Content).IsOptional().HasColumnType("text");
  18. this.Property(x => x.Order).IsOptional();
  19.  
  20. this.HasOptional(x => x.ExpertType)
  21. .WithMany()
  22. .HasForeignKey(x => x.TypeID)
  23. .WillCascadeOnDelete(false);
  24. }
  25. }

看上去没啥问题,但是问题就出在外键映射上面。

由于t_expert_content的外键TypeID 是t_expert_type表中的主键ID。由于我在映射的时候,写的是:

  1. this.Property(x => x.TypeID).IsRequired().HasMaxLength(36);

而在下面进行导航属性指定的时候,ExpertType被指定成了HasOptional类型的:

  1. this.HasOptional(x => x.ExpertType)
  2. .WithMany()
  3. .HasForeignKey(x => x.TypeID)
  4. .WillCascadeOnDelete(false);

导致二者产生了冲突,抛出了开头的错误。

知道了原因,解决方法就好办了:

  1. public class t_expert_content_mapper : EntityTypeConfiguration<t_expert_content>
  2. {
  3. public t_expert_content_mapper()
  4. {
  5. this.ToTable("t_expert_content");
  6.  
  7. this.HasKey(x => x.ID);
  8. this.Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
  9. this.Property(x => x.ID).HasMaxLength(36);
  10.  
  11. //this.Property(x => x.TypeID).IsRequired().HasMaxLength(36);
  12. this.Property(x => x.Name).IsRequired().HasMaxLength(500);
  13. this.Property(x => x.Publisher).IsOptional().HasMaxLength(150);
  14. this.Property(x => x.Count).IsOptional();
  15. this.Property(x => x.IsCheck).IsRequired();
  16. this.Property(x => x.PublishDate).IsRequired();
  17. this.Property(x => x.Content).IsOptional().HasColumnType("text");
  18. this.Property(x => x.Order).IsOptional();
  19.  
  20. this.HasRequired(x => x.ExpertType)
  21. .WithMany()
  22. .HasForeignKey(x => x.TypeID)
  23. .WillCascadeOnDelete(false);
  24. }
  25. }

需要说明的是,上面代码中的:

  1. 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. Android常用设计模式(一)

    java有23中设计模式,Android中也用到了很多的设计模式,本篇就来介绍Android中常用的几种设计模式 一.普通工厂设计模式 普通工厂设计模式,就是创建一个工厂类负责创建对象 ,用户根据需求 ...

  2. SQL 在表中随机取数据

    在一张10万行产品表(Product)中,随机取10条数据的几种方式: SET STATISTICS IO ON SELECT TOP 10 ID FROM dbo.Product(NOLOCK) W ...

  3. Effective Java 35 Prefer annotations to naming patterns

    Disadvantages of naming patterns Typographical errors may result in silent failures. There is no way ...

  4. Effective Java 63 Include failure-capture information in detail message

    Principle To capture the failure, the detail message of an exception should contain the values of al ...

  5. SQL 递归查询(根据指定的节点向上获取所有父节点,向下获取所有子节点)

    --------------------01.向上查找所有父节点-----------------WITH TEMP AS (SELECT * FROM CO_Department WHERE ID= ...

  6. 利用API方式进行数据库的增删改查

    /* 将数据库的增删改查单独放进一个包 */ package com.itheima28.sqlitedemo.dao; import java.util.ArrayList; import java ...

  7. malloc calloc 和 realloc

    realloc()函数 原型:extern void *realloc(void *mem_address, unsigned int newsize); 语法:指针名=(数据类型*)realloc( ...

  8. C++ new(2)

    1. new与operator new C++中有很多语法让人难以理解,如:new operator(操作符,下同)和operator new之间差异,确切的说,应该是new与operator new ...

  9. Linux shell basic3 dd wc comm chmod ls

    Generating files of any size /dev/zerois a character special device, which infinitely returns the ze ...

  10. HttpURLConnection发送POST请求(可包含文件)

    import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io. ...