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. UIPickerView控件中自定义展示的字体大小及样式

    - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger) ...

  2. 3.基础点的移动web

    1.移动端的屏幕适配 在Web开发中可以使用px(像素).em.pt(点).in(英寸).cm(厘米)做为长度单位,我们最常用px(像素)做为长度单位. 我们可以将上述的几种长度单位划分成相对长度单位 ...

  3. Quant的笑话

    Q) Why was the FX quant so unlucky with the ladies?A) Because he always kept his dates short. Q) Why ...

  4. OSX unable to write 'random state'

    openssl ca -gencrl -config ./config/openssl.cnf -out ./CA/crl/cacrl.pem -passin pass:'password' unab ...

  5. DotNet 资源大全中文版【转】

    转自:https://github.com/jobbole/awesome-dotnet-cn 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesom ...

  6. SpringMVC 请求路径结尾存在.使用@PathVariable访问路径内容,路径参数获取不准确的问题

    SpringMVC采用Get方式请求资源时,如果请求路径的结尾中带有小数点(.)时,同时使用@PathVariable访问路径内容时,请求路径中最后一个小数点及其后面的内容会被Spring截断丢弃比如 ...

  7. 多节点ListView的加载效率

    据说实际场景中node数量达到4k~6k,ListView就崩溃了.(怎么个崩溃法未知) 小试了一下,10w个node毫无压力.(win7 vs2010 .net2.0) 有意思的地方在于,动态添加如 ...

  8. RegOpenKeyEx和RegSetValueEx返回ERROR_SUCCESS,但注册表未发生变化。

    win7 x64,需要open的时候加上KEY_WOW64_64KEY. lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microso ...

  9. Three.js开发指南---使用three.js里的各种光源(第三章)

    本章的主要内容 1 three.js有哪些可用的光源 2 什么时候用什么光源. 3 如何调整配置各种光源 4 如何创建镜头炫光 一 光源 光源大概有7种, 其中基础光源有4种 环境光(AmbientL ...

  10. why happen "WaitHandles must be less than or equal to 64"

    一.背景: 在一个项目中碰到大数据插入的问题,一次性插入20万条数据(SQL Server),并用200个线程去执行,计算需要花费多少时间,因此需要等200个线程处理完成后,记录花费的时间,需要考虑的 ...