Entity Framework - 基于外键关联的单向一对一关系
代码的世界,原以为世界关系很简单,确道是关系无处不在.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 - 基于外键关联的单向一对一关系的更多相关文章
- Entity Framework - 理清关系 - 基于外键关联的单向一对一关系
注:本文针对的是 Entity Framework Code First 场景. 之前写过三篇文章试图理清Entity Framework中的一对一关系(单相思(单向一对一), 两情相悦(双向一对 ...
- Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联
2018-11-10 22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...
- Entity Framework定义外键,限制通过migration命令自动更改字段名称
1.问题 在定义一个表的外键时,通过add-migration命令生成,并通过update-database更新到数据库,发现外键名称发生了重命名.举例说明: 人员表[User](Id,Name,Pa ...
- Hibernate 再接触 关系映射 一对一单向外键关联
对象之间的关系 数据库之间的关系只有外键 注意说关系的时候一定要反面也要说通 CRUD 数据库之间设计 主键关联 单向的外键关联 中间表 一对一单向外键关联 Husband.java package ...
- 注解:【基于外键的】Hibernate单向1->1关联
Person与Address关联:单向1->1,[基于外键的] Person.java package org.crazyit.app.domain; import javax.persiste ...
- 《Entity Framework 6 Recipes》中文翻译系列 (29) ------ 第五章 加载实体和导航属性之过滤预先加载的实体集合和修改外键关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-13 过滤预先加载的实体集合 问题 你想过滤预先加载的实体集合,另外,你想使用 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-13 在基类中应用条件 问题 你想从一个已存在的模型中的实体派生一个新的实体, ...
- Entity FrameWork对有外键关联的数据表的添加操作
前天做了一个MVC Entity FrameWork项目,遇到有外键关联的数据编辑问题.当你编辑的时候,按照正常的逻辑,把每个字段的数据都对号入座了,然后点击保存按钮,本以为会顺理成章的编辑数据,但是 ...
- java之hibernate之基于外键的一对一单向关联映射
这篇讲解基于外键的一对一单向关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 注意:基于外键的一对一关联的表结构和多对一的表结构是一致的,但是,外键是唯一的. 2.类的结构 Pe ...
随机推荐
- 如何在一个Eclipse同时启动两个Tomcat
比如:有两个版本的tomcat,一个5.*,一个6.*,此时由于两个工程分别部署在两个版本的tomcat下,需要同时启动两个tomcat,以下是方法: 1.特别要注意: 不要设置CATALINA_HO ...
- 微信公众号调用JS-SDK
坑:先设置js接口安全域名,在公众号设置-功能设置-js接口安全域名中设置 授权登录功能需要在开发者中心页配置授权回调域名 文档:http://mp.weixin.qq.com/wiki/7/aaa1 ...
- Android之RecyclerView入门
首先来实现最简单的列表展示,如图 在这个展示中,RecyclerView的作用仅限于回收和定位屏幕上的TextView,在用户滑动屏幕时,会把上一个视图回收掉,并显示下一个页面的视图,也就是回收再利用 ...
- 一个move_uploaded_file()引起的PHP异常与错误的深入理解
背景:我在公司开发一个产品Excel导入到数据库的功能,写起来挺快的,用phpexcel几下就写好了,本地测试挺顺的,git push上去,项目负责人部署到测试环境,就出现问题了.具体问题一句话不好说 ...
- 列表操作之定义,切片(取元素)(Python)
学完列表,元组,字典,集合以后,发现他们长的有些像,傻傻分不清,现在回顾下,以代码为例进行分析每一种操作的属性.(英语不佳,错误请忽略) 举栗如下:names = ["hbb",' ...
- SSH连不上虚拟机的问题解决
这几天工作任务不重,今早上班打算在liunx下运行下python脚本.打开VM,SSH突然连不上虚拟机了.网上试了很多方法都不行,最后花费2个小时解决了这一问题. 结合我的实际情况,问题解决如下: 1 ...
- tar+pigz+ssh实现大数据压缩传输
磁盘读取---->打包---->压缩------>传输---->解压缩-->拆包---->落盘 |->tar |->gzip |-&g ...
- 关于net mail组件ssl端口问题
最近开发一个项目使用到.net mail组件发送邮件.在开发环境中一切正常,可是部署到阿里云服务器上死活发送不出去,一直连接不上,或者报语法错误. 然后是各种折腾,各种测试,最后发现,使用ssl的时候 ...
- hdu_1907:John(Nim变形)
题目链接 仍是取石子,不过取到最后一个的败 参考链接:http://www.voidcn.com/blog/liwen_7/article/p-3341825.html 简单一句话就是T2 S0必败 ...
- 如何通过android代码获取LTE信息?
最近为了成功得到LTE的信号强度,尝试了很多种方法: (1)通过解析signalstrength字符串,但是不同手机设备获得的字符串排列顺序不同,代码如下: private PhoneStateLis ...