代码的世界,原以为世界关系很简单,确道是关系无处不在.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. 网络请求工具类WebServiceUtils

    如果对WebService一无所知的话,建议先看看这两篇博客,对你WebService很有帮助. http://blog.csdn.NET/eyu8874521/article/details/912 ...

  2. Kinect用体感来实现UI控件的点击

    用体感来实现UI控件的点击,如点击按钮. 做法:用一个图片表示左手手掌,图片位置追踪左手手掌移动,当手掌位于UI控件的矩形内时,握拳表示点击该控件. using UnityEngine; using ...

  3. webpack2归纳总结

    本文github仓库:https://github.com/Rynxiao/webpack2-learn 从v1迁移到v2 1. 配置类型 在webpack1的时候,主要是通过导出单个object来进 ...

  4. 列表操作之定义,切片(取元素)(Python)

    学完列表,元组,字典,集合以后,发现他们长的有些像,傻傻分不清,现在回顾下,以代码为例进行分析每一种操作的属性.(英语不佳,错误请忽略) 举栗如下:names = ["hbb",' ...

  5. iOS 模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.

    引导 Copyright © PBwaterln Unauthorized shall not be *copy reprinted* . 对于从事 iOS 开发人员来说,所有的人都会答出「runti ...

  6. AddDigitsTotal - 把数字中单个数相加

    给定一个int数字,把数字中的单个数相加起来:得到的结果如果不是个位数,继续相加 如给定 19,执行1+9 = 10 --> 1 + 0 = 1  返回1 给定22,返回4 思路很简单,把各个位 ...

  7. Codeforces_499C:Crazy Town(计算几何)

    题目链接 给出点A(x1,y1),B(x2,y2),和n条直线(ai,bi,ci,aix + biy + ci = 0),求A到B穿过多少条直线 枚举每条直线判断A.B是否在该直线两侧即可 #incl ...

  8. PM2源码浅析

    PM2工作原理 最近在玩一个游戏,<地平线:黎明时分>,最终Boss是一名叫黑底斯的人,所谓为人,也许不对,黑底斯是一段强大的毁灭进程,破坏了盖娅主进程,从而引发的整个大陆机械兽劣化故事. ...

  9. 介绍CSS的相关知识

    以下是我跟大家分享的有关CSS的相关知识点: ①什么是CSS? css(Cascading Style Sheets)是层叠样式表 ②css的三种样式使用方法: 1,内联样式表:直接在html标签属性 ...

  10. 再起航,我的学习笔记之JavaScript设计模式01

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 在通 ...