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. code forces 382 D Taxes(数论--哥德巴赫猜想)

    Taxes time limit per test 2 seconds memory limit per test 256 megabytes input standard input output ...

  2. Ruby 方法

    Ruby 方法 Ruby 方法与其他编程语言中的函数类似.Ruby 方法用于捆绑一个或多个重复的语句到一个单元中. 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常 ...

  3. 在VS2013中使用Log4net

    大致分为3个步骤 引用Log4net

  4. 10天学会phpWeChat——第一天:核心框架的目录结构

    phpWeCaht是一款优秀的PC网站+微信公共号开发框架. 本博客系列将图文结合,详细介绍phpWeChat 的使用方法,今天进入phpWeChat系列教程之<10天学会phpWeChat&g ...

  5. java-final关键字

    一.final理解 编程语言中关键字,final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的.在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个 ...

  6. 042. asp.net使用缓存来提高母版页的访问性能

    Asp.Net缓存技术是一项非常重要的技术, 当一个页面被频繁的访问, 如果不使用缓存技术, 那么每访问一次就要回发一次服务器, 显然这样对服务器造成很大的负担, 所以, 可以在被频繁访问的页面中设置 ...

  7. ASP.NET的MVC项目BUG——“所需的防伪表单字段‘__RequestVerificationToken’不存在”

    问题:所需的防伪表单字段‘__RequestVerificationToken’不存在 解决办法: [ValidateAntiForgeryToken]能在[HttpPost]下用 [Validate ...

  8. selenium环境搭建

    开发环境: 1.jdk 2.eclipse 3.selenium,selenium只需要selenium-java-2.45.jar这个就可以 具体搭建步骤可参考:http://www.cnblogs ...

  9. Java基础--serialVersionUID

    Java基础--serialVersionUID serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式: 一个是默认的1L,比 ...

  10. net reactor加密源码保软件安全-net reactor使用教程

    上一次介绍用 Xenocode Postbuild for .NET 混淆加密源代码确保软件安全,本篇将讨论用 Eziriz .NET Reactor 混淆加密软件源代码,为从未用过该软件加密的用户分 ...