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. 通过js的console优雅的将php调试信息输出

    function consoleLog($val){ $debug = debug_backtrace(); unset($debug[0]['args']); echo '<script> ...

  2. 统计Apache或Nginx访问日志里的独立IP访问数量的Shell

    1.把IP数量直接输出显示: cat access_log_2011_06_26.log |awk '{print $1}'|uniq -c|wc -l 2.把IP数量输出到文本显示: cat acc ...

  3. python之目录文件操作

    [1.os] 1.重命名:os.rename(old, new) 2.删除:os.remove(file) 3.列出目录下的文件 :os.listdir(path) 4.获取当前工作目录:os.get ...

  4. maven加载jar包配置

    maven build时报程序包不存在和找不到符号的错误,但是代码中不报错,如下: [ERROR] Failed to execute goal org.apache.maven.plugins:ma ...

  5. Eclipse

    001.自动注释  window--preferences--java--codeStyle--codeTemplate--comments //Types: /** *@author ${user} ...

  6. WindowsAPI开发常用资料

    主类 子类 功能 Win32API SHGetSpecialFolderLocation 获取系统特殊文件夹路径(SHGetSpecialFolderLocation) 通过 SHGetSpecial ...

  7. mysql学习之触发器

    在借阅表和读者表当中存在着这样的关系,如果在借阅表当中添加一条数据,读者表当中对应的累计借书字段就自增1,如果在借阅表当中删除一条数据,读者表当中对应的累计借书字段就自减1,实现本功能的方法如下. 1 ...

  8. MAC的终端命令

    今天小研究了一下MAC的终端命令,主要为了方便调试程序用,XCODE用不来啊... 在这里记下..防止丢失 pwd 当前工作目录 cd(不加参数) 进root cd(folder) 进入文件夹 cd ...

  9. golang下的grpc

    facebook的thrift也是开源rpc库,性能高出grpc一倍以上,grpc发展的较晚,期待以后有长足的进步.简单来说thrift = grpc + protobuf gRPC基于HTTP/2标 ...

  10. 039. asp.netWeb用户控件之七实现具有虚拟键盘的功能的用户控件

    用户控件ascx代码: <%@ Control Language="C#" AutoEventWireup="true" CodeFile="K ...