EF中的1:0或1:1关系以及1:n关系
先给出1:0关系
User表包括用户名和密码
public class User
{
public int ID { get; set; } public string UserName { get; set; } public string Passwd { get; set; } public virtual UserInfo UserInfo { get; set; } }
UserInfo表包括用户信息
public class UserInfo
{
public int ID { get; set; } public string Name { get; set; } public string Phone { get; set; } public virtual User User { get; set; } }
UseInfos中的ID即是主键也是外键
再给出1:n关系
Video表包括视频的信息
public class Video
{
public int ID { get; set; } public string Title { get; set; } public virtual ICollection<VideoRecord> Records { get; set; }
}
Record表包括视频的观看记录
public class VideoRecord
{
public int ID { get; set; } public DateTime CrateAt { get; set; } public string IP { get; set; } public Video Video { get; set; }
}

下面是关系的设置。
modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<User>().HasKey(u => u.ID);
modelBuilder.Entity<UserInfo>().ToTable("UserInfos");
modelBuilder.Entity<UserInfo>().HasKey(i =>i.ID);
////针对“1:0或1:1”关系的设置
modelBuilder.Entity<User>().HasOptional(u => u.UserInfo)
.WithRequired(i => i.User);
modelBuilder.Entity<Video>().ToTable("Videos");
modelBuilder.Entity<Video>().HasKey(v => v.ID);
modelBuilder.Entity<VideoRecord>().ToTable("VideoRecords");
modelBuilder.Entity<VideoRecord>().HasKey(r => r.ID);
////针对“1:n”关系的设置
modelBuilder.Entity<Video>().HasMany(v => v.Records)
.WithRequired(r => r.Video);
测试程序
Context context = new Context();
UserInfo userInfo = new UserInfo() { ID = 1, Name = "李占朋", Phone = "3205" };
User user = new User() { ID = 1, UserName = "lizhanpeng", Passwd = "123456", UserInfo = userInfo };
context.Set<User>().Add(user);
context.SaveChanges();
context.Set<User>().Include(x => x.UserInfo).
ToList().ForEach(x =>
{
Console.WriteLine(x.UserName + "真实姓名为:" + x.UserInfo.Name);
});
List<VideoRecord> records = new List<VideoRecord>();
records.Add(new VideoRecord() { ID = 1, IP = "127.0.0.1", CrateAt = DateTime.Now });
records.Add(new VideoRecord() { ID = 2, IP = "127.0.0.1", CrateAt = DateTime.Now });
Video video = new Video() { ID = 1, Title = "视频1", Records = records };
context.Set<Video>().Add(video);
context.SaveChanges();
var vd = context.Set<Video>().Include(x => x.Records).FirstOrDefault();
vd.Records.ToList().ForEach(r =>
{
Console.WriteLine("浏览者IP:" + r.IP + "浏览视频" + vd.Title);
});
//参考http://www.cnblogs.com/dudu/archive/2011/07/09/entity_framework_one_to_many.html
EF中的1:0或1:1关系以及1:n关系的更多相关文章
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- 2.EF中 Code-First 方式的数据库迁移
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...
- EF中执行sql语句,以及事务
EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...
- DB表的关系及EF中Fluent API的使用
现在使用多数的数据库是关系型数据库,那么表与表之间的关系就会显得尤其重要,对于数据的CRUD处理和以后数据的分析有很大的好处.下面是对于数据库中对表关系的理解以及在EF中使用Fluent API来创建 ...
- mvc+ef中比较数据
例如:根据Para表中的type和paraid 字段进行比较 public class TypeComparer : IEqualityComparer<Para> { bool IEqu ...
- EF中逆变和协变
EF中的增删改查: 实现步骤: 1.声明一个EF的上下文. bjhksjEntities dbContext = new bjhksjEntities(); 2.声明一个实体. HKSJ_USERS ...
- EF中使用SqlQuery进行参数化查询时抛出异常
EF中使用带参数的SqlQuery进行查询时,抛出"另一个 sqlparametercollection 中已包含 sqlparameter"异常. 这是由于SqlParamert ...
- EF中执行原生sql与使用Local获取本地数据
使用DbSet的Local属性可以访问当前context中被追踪且没有被标记为删除的实体(内存中的数据) using (var context = new BloggingContext()) { / ...
- EF中的transaction的使用范例
注意一点: 在EF中使用事物后,对于一个新增的model,在saveChanges后,可以得到该实体的自增ID,但在提交事物之前, 该数据并没有真正的新增到DB中,但此时可以得到model新增的自增I ...
随机推荐
- xcode9报错 Safe Area Layout Guide before iOS9.0
运行工程的时候会遇到 Safe Area Layout Guide before iOS9.0 这是因为xcode9 storyboard的设置里面多了 个 Safe Area Layout Gu ...
- Swift 类
1.类概念 类是一种抽象的概念,它实际上并不存在于现实中的时间和空间里. 在定义一个类时,我们就会在类中定义该类事物的特性和行为,从术语上讲,特性叫类的属性,行为叫类的方法. 类是一个静态的概念,类本 ...
- GIF Brewery for Mac(录制 Gif 动图工具)安装
1.软件简介 GIF Brewery 一款用于录制 Gif 动图等的工具. 2.资源列表 链接 提取密码 系统要求 软件语言 GIF Brewery for Mac v3.9.5 ltmf ma ...
- Python 文件 write() 方法
概述 Python 文件 write() 方法用于向文件中写入指定字符串. 在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的. 语法 write() 方法语法如 ...
- 例说Linux内核链表(一)
介绍 众所周知,Linux内核大部分是使用GNU C语言写的.C不同于其它的语言,它不具备一个好的数据结构对象或者标准对象库的支持. 所以能够借用Linux内核源代码树的循环双链表是一件非常值得让人高 ...
- 主流磁盘接口比较(SATA/SCSI/SAS/FC)[转]
数据越来越多,用户对存储容量的要求是越来越高.作为数据存储最基本的介质——硬盘,其种类也越来越多.面对市场上纷繁复杂的硬盘,用户又该如何选择呢?本文就对SATA.FC.SAS三种硬盘进行了比较,希望能 ...
- JS charCodeAt在PHP中的等价物(完整的unicode和表情符号兼容性)
我在JS中有一个简单的代码,如果涉及特殊字符,我无法在PHP中复制. 这是JS代码(请参阅JSFiddle输出): var str = "t
- 类里的通用成员函数应声明为static
类C的成员函数f,如果f的实现实现不依赖于C的任何成员变量,则f为通用函数. 对于通用函数f,可以将其从类C中分离出来做成一个全局函数,也可以仍然让它属于类C,但加上static. 两种处理方法实际都 ...
- meterpreter命令大全
在其最基本的使用,meterpreter 是一个 Linux 终端在受害者的计算机上.这样,我们的许多基本的Linux命令可以用在meterpreter甚至是在一个窗口或其他操作系统. 这里有一些核心 ...
- grafana 的面板设置
1.工作中我们会计算连个字段的四则运算
