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. Apache2.4.6服务器安装及配置

    一.系统环境 系统版本:Aliyun Linux release 5.7 内核版本:2.6.18-274.el5 apr版本:apr-1.4.8 apr-util版本:apr-util-1.5.2 p ...

  2. SpringMvc 页面DATE传值问题

    页面传过来yyy-MM-dd格式的日期类型,springMVC是不认的. 解决办法: @DateTimeFormat(pattern="yyyy-MM-dd") 在类属性上加上注解 ...

  3. pyqt4:线程的串联运行方式

    有些时候我们在pyqt中需要线程串行运行,而不是并发运行,用以下方式,这是在网上找的,暂存. > Hello > I have something like the foll scenar ...

  4. HDU-2825 Wireless Password(AC自动机+状压DP)

    题目大意:给一系列字符串,用小写字母构造出长度为n的至少包含k个字符串的字符串,求能构造出的个数. 题目分析:在AC自动机上走n步,至少经过k个单词节点,求有多少种走法. 代码如下: # includ ...

  5. mysql coalesce函数

    COALESCE函数从值列表中返回第一个非NULL的值,当遇到NULL值时将其替换为0. coalesce(str1,str2....); e.g.   需要在表中查出所有比'WARD'提成(COMM ...

  6. canvas 画字

    用canvas画字还是头一回,要想和UI设计的画的一模一样还是真有些苦难,不过现在实现的效果已经很像了. <!--通过字体文件引入字体--><style>@font-face ...

  7. 使用lua实现一个简单的事件派发器

    设计一个简单的事件派发器,个人觉得最重要的一点就是如何保证事件派发过程中,添加或删除同类事件,不影响事件迭代顺序和结果,只要解决这一点,其它都好办. 为了使用pairs遍历函数,重写了pairs(lu ...

  8. unity 内存中切割图片

    一般的说我们切割图片是将一张图片资源切割成更小的图片资源,也就是说在资源上就进行了切割,比如ugui上的切割方法. 如果我们有一些情况比如做拼图,可能让玩家自己选择自己的生活照作为拼图的原图. 那么我 ...

  9. 如何解决CDR x8安装时显示“已停止工作”

    相信很多朋友在安装cdr X8时会遇到这样一种情况,能装上去,但不能运行,弹出提示说CorelDRAW X8(64-bit)已停止工作.同样的X8安装包,在不同的电脑上测试有的没有问题,有的则会出现以 ...

  10. 远程监控显示brother数控机床数据

    最近几个月公司太忙了,到现在已经连续出差两个多月了. 这个项目这要做mes系统,涉及到产品在机床的加工过程监控,然后led看板显示产品进度. 这里的主角是日本的brother数控机床,服务器按照一定频 ...