1、创建新项目并引入Entity Framework

然后就可以开始使用EF了

2、使用一对多

Users 用户类,UserDetail用户详情类:一个用户对应多个详情(仅用于测试)

 public class UserDetail
{
public int DetailId { get; set; }
public string NAME { get; set; }
public int uid { get; set; }
public string remark { get; set; }
public virtual Users user { get; set; }
}
public class Users
{
public int id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public DateTime Birth { get; set; }
public virtual ICollection<UserDetail> detail { get; set; } }

ObjectContext类:

 public class ObjectContext : DbContext
{
public ObjectContext()
: base("server=.;uid=xx;pwd=xxx;database=XXX")
{ }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Users>().HasKey(p => p.id);
modelBuilder.Entity<UserDetail>().ToTable("UserDetail");
modelBuilder.Entity<UserDetail>().HasKey(p => p.DetailId);
modelBuilder.Entity<UserDetail>().Property(p => p.NAME).HasColumnName("NAME");
modelBuilder.Entity<UserDetail>().HasRequired(p => p.user).WithMany(p => p.detail).HasForeignKey(p => p.uid);
}
public DbSet<Users> users { get; set; }
public DbSet<UserDetail> userdetail { get; set; } }

查询方法:

 public void GetAll()
{
using (ObjectContext db = new ObjectContext())
{
var users = (from a in db.users select a).ToList<Users>();
for (int i = ; i < users.Count; i++)
{
Console.WriteLine("ID:"+users[i].id+",Name:"+users[i].Name);
foreach (var item in users[i].detail)
{
Console.WriteLine(" id:" + item.DetailId + ",NAME" + item.NAME);
}
}
}
}

删除和修改子集同时进行方法

 public void Update()
{
using (ObjectContext db = new ObjectContext())
{
var users = (from a in db.users where a.id == select a).First();
//删除子集
var detailitem=users.detail.Where(p=>p.DetailId==).FirstOrDefault();
db.Entry(detailitem).State = System.Data.Entity.EntityState.Deleted;
users.detail.Remove(detailitem);
//修改子集
var detailitem2 = users.detail.Where(p=>p.DetailId==).FirstOrDefault();
detailitem2.NAME = "这是修改后的数据";
db.Entry(detailitem2).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
}
}

3、使用多对多

新增一个角色类 Roles

 public class Roles
{
public Roles()
{
users = new HashSet<Users>();
}
public int RoleID { get; set; }
public string RoleName { get; set; }
public string Remark { get; set; }
public virtual ICollection<Users> users { get; set; }
}

修改ObjectContext类:

 modelBuilder.Entity<Roles>().HasKey(p => p.RoleID);
//modelBuilder.Entity<UserRoles>().HasKey(p => p.ID);
modelBuilder.Entity<Roles>().HasMany(p => p.users).WithMany(p => p.roles).Map(
p =>
{
p.MapLeftKey("RoleId");
p.MapRightKey("UserId");
p.ToTable("UserRoles");
});

4、测试方法:

 public static void AddUserRole()
{
using (ObjectContext db = new ObjectContext())
{
//添加一个用户 两个角色
var user = new Users() { Name = "Test用户1", Age = , Birth = DateTime.Now };
var role1 = new Roles() { RoleName = "Test角色1" };
var role2 = new Roles() { RoleName = "Test角色2" };
user.roles.Add(role1);
user.roles.Add(role2);
db.users.Add(user);
db.SaveChanges();
}
}
查询:
 public static void GetAllUserRoles()
{
using (ObjectContext db = new ObjectContext())
{
var users = (from a in db.users select a).ToList<Users>();
if (users != null)
{
Console.WriteLine("User查询结果:");
foreach (var item in users)
{
Console.WriteLine("UserID:" + item.id + ",UserName:" + item.Name + ",Birth:" + item.Birth);
if (item.roles != null)
{
foreach (var role in item.roles)
{
Console.WriteLine(" RoleId:" + role.RoleID + ",RoleNmae:" + role.RoleName + ",UserId:" + item.id);
}
}
}
}
var roles = (from a in db.roles select a).ToList<Roles>();
if (roles != null)
{
Console.WriteLine("Role查询结果:");
foreach (var item in roles)
{
Console.WriteLine("RoleID:" + item.RoleID + ",RoleName:" + item.RoleName);
if (item.users != null)
{
foreach (var user in item.users)
{
Console.WriteLine(" UserID:" + user.id + ",UserName:" + user.Name + ",Birth:" + user.Birth + ",RoleID:" + item.RoleID);
}
}
}
}
}
}

然后写完测试。。。

源代码:EFDemo

EF初级入门 (一对多、多对多)的更多相关文章

  1. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  2. SSAS中事实表中的数据如果因为一对多或多对多关系复制了多份,在维度上聚合的时候还是只算一份

    SSAS事实表中的数据,有时候会因为一对多或多对多关系发生复制变成多份,如下图所示: 图1 我们可以从上面图片中看到,在这个例子中,有三个事实表Fact_People_Money(此表用字段Money ...

  3. 响应式Web初级入门

    本文来自我的前端博客,原文地址:http://www.hacke2.cn/about-responsive/ 跨终端时代的到来 当你乘坐各种交通工具(公交.地铁.轻轨.火车)时你会发现,人们都个个低下 ...

  4. 使用NHibernate(7)-- 一对一 && 一对多 && 多对多

    1, 一对一. 对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放:比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成 ...

  5. Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

    1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...

  6. Sping AOP初级——入门及简单应用

    在上一篇<关于日志打印的几点建议以及非最佳实践>的末尾提到了日志打印更为高级的一种方式——利用Spring AOP.在打印日志时,通常都会在业务逻辑代码中插入日志打印的语句,这实际上是和业 ...

  7. Linux初级入门(第一次作业)

    Linux初级入门 在本科期间学过一些Linux的简单命令,再次接触Linux不仅巩固了知识还学习到了很多新的东西. 什么是操作系统? 操作系统,英文名称Operating System,简称OS,是 ...

  8. Spring AOP初级——入门及简单应用

      在上一篇<关于日志打印的几点建议以及非最佳实践>的末尾提到了日志打印更为高级的一种方式——利用Spring AOP.在打印日志时,通常都会在业务逻辑代码中插入日志打印的语句,这实际上是 ...

  9. 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别

    EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...

随机推荐

  1. CPU的栈机制的一个小问题

    比如要实现下面这个功能. 我们如果要在10000H处写入自行数据2266H,不能用“mov 内存单元, 寄存器”这类指令.怎么做? 代码: mov ax, 1000h mov ss, ax mov s ...

  2. [马哥学习笔记]Linux系统裁剪之制作带网络功能的可启动linux

    知识基础: 系统启动流程:POST-->BIOS(boot sequence)-->GRUB(bootloder(stage1:MBR;stage2:grub目录中))-->kern ...

  3. 【转载】让你的MATLAB代码飞起来

    原文地址:http://developer.51cto.com/art/201104/255128_all.htm MATLAB语言是一种被称为是"演算纸"式的语言,因此追求的是方 ...

  4. lua Getter&Setter简单实现

    lua是一门简单的语言,不带类和属性封装,但可以使用lua强大的元表模拟实现: class.lua local type = type local rawset = rawset local setm ...

  5. Ret2Libc 练习(1) -- ZwSetInformationProcess

    花了两个小半晚上的时间将0day安全这本书的绕过DEP的第一个实验做了,这里做些笔记. Ret2libc 我现在自己的理解就是在开启DEP保护的情况下,在程序的其他的可执行位置找到可以满足我利用要求的 ...

  6. TD Rigging Demo Reel 性感美女绑定展示

    161455520158189 这是一个充满回忆的Demo,非常怀念之前的工作生活,也特别感谢我长春的老哥张总对我的帮助与指导,不光是工作中,在生活上也让我有很大的收获.这个一直都觉得做的不够好,也从 ...

  7. malloc分配的内存空间是连续的吗

    1.linux内核管理内存空间的分配,所有程序对内存空间的申请和其他操作,最终都会交给内核来管理. 2.linux实现的是“虚拟内存系统”,对用户而言,所有内存都是虚拟的,也就是说程序并不是直接运行在 ...

  8. 嵌入式系统上实现GPS全球定位功能

    GPS(Global Positioning System)即全球定位系统,是由美国建立的一个卫星导航定位系统,利用该系统,用户可以在全球范围内实现全天候.连续.实时的三维导航定位和测速:另外,利用该 ...

  9. [PHP] - Laravel - 列表、新增、修改、删除例子

    前言 Laravel默认是自带了CURD的功能,使用路由的Route::resource可以做到. 但真正的项目中,这往往不是我们所需要的.因为一个项目会有比较复杂的计算.验证等功能. 下面是对项目中 ...

  10. cordova环境配置

    1,安装node.js 2,安装git 3,安装cordova 安装node.js后,命令行输入:npm install -g cordova 加@版本号可安装指定版本,如:npm istall -g ...