代码的世界,原以为世界关系很简单,确道是关系无处不在.NET世界里ORM框架中EntityFramework作为其中翘楚,大大解放了搬砖工作的重复工作,着实提高了不少生产力,而也碰到过不少问题!比如关系的映射!

一对一关系的映射:

用户账户密码信息表:包含用户名 密码 邮箱等账户登录时的信息

public class SystemAccount
{
public SystemAccount()
{
Id = DateUtils.GeneratedNewGuid();
}
public Guid Id { get; set; }
public string Salt { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Tele { get; set; }
public Guid UserId { get; set; }
public virtual User User { get; set; }
public virtual User CreateUser(string nick)
{
var user = new User();
user.Nick = nick;
return user; }
}

  用户信息表:包含用户真实姓名,经纬度,昵称,性别等会员信息

public class User
{
public User()
{
Id = DateUtils.GeneratedNewGuid();
}
public Guid Id { get; set; }
public string Nick { get; set; }
public int Gender { get; set; }
public Guid AccountId { get; set; }
public virtual SystemAccount Account { get; set; }
}

  然后fluent api关系配置如下

 public class SystemAccountMapping : FarmerEntityTypeConfiguration<SystemAccount>
{
public SystemAccountMapping()
{
this.HasKey(r => r.Id);
this.Property(r => r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
this.HasRequired(r => r.User).WithMany().HasForeignKey(fk => fk.UserId);
}
}

  

 public class UserMapping : FarmerEntityTypeConfiguration<User>
{
public UserMapping()
{ this.HasKey(r => r.Id);
this.Property(r => r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
this.HasRequired(r => r.Account).WithMany().HasForeignKey(fk => fk.AccountId);
}
}

  然后加上数据库初始化种子数据

internal sealed class CreateIfNoExistDatabase : DbMigrationsConfiguration<FarmerObjectContext>
{
public CreateIfNoExistDatabase()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
} protected override void Seed(FarmerObjectContext context)
{
SystemAccount account = new SystemAccount();
account.UserName = "shatan776";
account.Salt = "oxml";
account.Password = StringUtils.GenerateSaltedHash("123456", StringUtils.CreateSalt(AppConstants.SaltSize));
account.User = account.CreateUser("老子就是张三");
context.Set<SystemAccount>().Add(account);
context.SaveChanges();
}
}

  

满脸欢喜的debug,来上一口16年的雪碧,静静的等着,结果任务栏宇宙第一ide VisualStudio加蓝,

将 FOREIGN KEY 约束 'FK_dbo.Farmer_User_dbo.Farmer_SystemAccount_AccountId' 引入表 'Farmer_User' 可能会导致循环或多重级联路径。请指定 ON DELETE    NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
   无法创建约束。请参阅前面的错误消息。

多重循环引用,纳尼,

难道是SystemAccount中加载了User的导航,User中也有,重复了?于是乎,注释掉UserMapping中的导航配置

//this.HasRequired(r => r.Account).WithMany().HasForeignKey(fk => fk.AccountId);

  继续debug错误依据,于是乎又把导航Id注释掉

//public Guid AccountId { get; set; }

哒哒哒达,终于生成了数据库,种子数据也有插入

一对一的关系就这样生成了,执子之手,与子偕老,张三看上了李四。。。

琢磨着把以前的账户系统移过来,以前的主键是int类型的数据库自增的,修改相应类型后,报错了,找不到account_target,也对,当插入到数据库中时account主键Id是没有生成的,所以user是插入不进去的,笨办法,先插入account,然后再插入user,暂时解决了问题!

看了一下生成的数据库外键图

看数据库生成的关系,0=》1。。。可以送SystemAccount实体类中生成User,而User中生成SystemAccount就会报错,用户信息必须有会员账户记录,而会员账户记录可以没有用户信息

更多资料参考

Entity Framework - 理清关系 - 基于外键关联的单向一对一关系

Entity Framework - 基于外键关联的单向一对一关系的更多相关文章

  1. Entity Framework - 理清关系 - 基于外键关联的单向一对一关系

      注:本文针对的是 Entity Framework Code First 场景. 之前写过三篇文章试图理清Entity Framework中的一对一关系(单相思(单向一对一), 两情相悦(双向一对 ...

  2. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  3. Entity Framework定义外键,限制通过migration命令自动更改字段名称

    1.问题 在定义一个表的外键时,通过add-migration命令生成,并通过update-database更新到数据库,发现外键名称发生了重命名.举例说明: 人员表[User](Id,Name,Pa ...

  4. Hibernate 再接触 关系映射 一对一单向外键关联

    对象之间的关系 数据库之间的关系只有外键 注意说关系的时候一定要反面也要说通 CRUD 数据库之间设计 主键关联 单向的外键关联 中间表 一对一单向外键关联 Husband.java package ...

  5. 注解:【基于外键的】Hibernate单向1->1关联

    Person与Address关联:单向1->1,[基于外键的] Person.java package org.crazyit.app.domain; import javax.persiste ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (29) ------ 第五章 加载实体和导航属性之过滤预先加载的实体集合和修改外键关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-13  过滤预先加载的实体集合 问题 你想过滤预先加载的实体集合,另外,你想使用 ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-13  在基类中应用条件 问题 你想从一个已存在的模型中的实体派生一个新的实体, ...

  8. Entity FrameWork对有外键关联的数据表的添加操作

    前天做了一个MVC Entity FrameWork项目,遇到有外键关联的数据编辑问题.当你编辑的时候,按照正常的逻辑,把每个字段的数据都对号入座了,然后点击保存按钮,本以为会顺理成章的编辑数据,但是 ...

  9. java之hibernate之基于外键的一对一单向关联映射

    这篇讲解基于外键的一对一单向关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 注意:基于外键的一对一关联的表结构和多对一的表结构是一致的,但是,外键是唯一的. 2.类的结构 Pe ...

随机推荐

  1. dict-字典功能介绍

    叨逼叨:#字典 可变类型 意思就是修改的是自己本身#可变类型,当修改后,内存里的值也会对应着修改#不可变类型,当修改后,会在内存里开启一块新的空间,放新的值#1.清空 # name = { # 'na ...

  2. 掌握好这23个Linux命令常用项

    运维工程师(Operations)在国内又称为运维开发工程师(Devops),在国外称为 SRE(SiteReliability Engineering).负责维护并确保整个服务的高可用性,同时不断优 ...

  3. 【干货】JS相关知识点总结

    一.获取元素方法 可以使用内置对象document上的getElementById方法来获取页面上设置了id属性的元素,获取到的是一个html对象,然后将它赋值给一个变量.如下: 上面的语句,如果把j ...

  4. tomcat一个端口配置多个项目

    在server.xml中增加host节点 <Host name="localhost" appBase="webapps" <!--这是默认的--- ...

  5. jmeter- Java-POST接口使用get与json格式传参

    在测试过程中发现各种接口传参形式,今天就来说说小编遇到的一种,接口请求方式为POST:URL传参以GET形式并携带JSON 可能这样诉说有不少同学不太理解. 如图: 上图所示就是一般get请求传参格式 ...

  6. Spark的误解-不仅spark是内存计算,hadoop也是内存计算

    市面上有一些初学者的误解,他们拿spark和hadoop比较时就会说,Spark是内存计算,内存计算是spark的特性.请问在计算机领域,mysql,redis,ssh框架等等他们不是内存计算吗?依据 ...

  7. StringBuilder类中的重要方法

    下面的API注解包含了StringBuilder类中的重要方法 append(boolean b):将 boolean 参数的字符串表示形式追加到序列. append(char c):将 char 参 ...

  8. NPOI+反射 实现快速导出

    只是觉得这样很方便 记录一下 公司有封装的方法,不过是查出的Table类型,每次用的时候很都很烦,处理数据也不方便,最主要的是我也没耐心去看,反正在我看来很麻烦,用的时候很头疼.还是习惯通过Model ...

  9. 【转载】DHCP流程

    来源: http://network.51cto.com/art/201406/441752.htm DHCP是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动 ...

  10. nyoj_3:多边形重心问题(计算几何)

    基础的计算几何 多边形的n个顶点按*时针方向给出 由任意n边形可分解为n-2个三角形,各三角形面积面积与重心易得,故有各三角形的面积及重心 用重心公式可求得多边形的面积与重心 题目链接: http:/ ...