EntityFramework之一对多关系(三)

上篇介绍了一对一关系,下面介绍下一对多关系代码编写。

1、新建model实体,Product是产品类,Order是订单,一个产品对应多个订单

 1     public class Product
 2     {
 3         public int Id { get; set; }
 4         public string Name { get; set; }
 5         public string Description { get; set; }
 6
 7         public virtual ICollection<Order> Orders { get; set; }
 8     }
 9
10     public class Order
11     {
12         public int Id { get; set; }
13         public int ProductId { get; set; }
14         public DateTime Date { get; set; }
15         public string ShippingAddress { get; set; }
16
17         public virtual Product Product { get; set; }
18     }

2、创建一个EntityContext并继承自DbContext

 1     public class EntityContext : DbContext
 2     {
 3         public EntityContext()
 4             : base("name=DBConnectionString")
 5         {
 6
 7         }
 8
 9         public DbSet<Product> Product { get; set; }
10         public DbSet<Order> Order { get; set; }
11
12         protected override void OnModelCreating(DbModelBuilder modelBuilder)
13         {
14             modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
15             base.OnModelCreating(modelBuilder);
16         }
17     }

3、在web.config文件中添加数据库连接字符串

1   <connectionStrings>
2     <add name="DBConnectionString" connectionString="Data Source=.;Initial Catalog=OneToMany;Integrated Security=true" providerName="System.Data.SqlClient" />
3   </connectionStrings>

4、接着创建实体映射

 1     public class ProductMap : EntityTypeConfiguration<Product>
 2     {
 3         public ProductMap()
 4         {
 5             ToTable("Product");
 6             HasKey(p => p.Id);
 7             //这个同OrderMap中注释语句效果一样,默认是级联
 8             HasMany(p => p.Orders).WithRequired(o => o.Product).HasForeignKey(o => o.ProductId).WillCascadeOnDelete(false);
 9         }
10     }
11
12     public class OrderMap : EntityTypeConfiguration<Order>
13     {
14         public OrderMap()
15         {
16             ToTable("Order");
17             HasKey(o => o.Id);
18             //WillCascadeOnDelete:不使用级联删除
19             //HasRequired(o => o.Product).WithMany(p => p.Orders).HasForeignKey(o => o.ProductId).WillCascadeOnDelete(false);
20         }
21     }

5、我们写一些操作,让Code First生成数据库并验证数据是否新增

 1     EntityContext db = new EntityContext();
 2     var product = new Product() { Description = "电器", Name = "电磁炉" };
 3     db.Set<Product>().Add(product);
 4     db.SaveChanges();
 5
 6     var order = new Order() { Date = DateTime.Now, ProductId = product.Id, ShippingAddress = "江西南昌" };
 7     db.Set<Order>().Add(order);
 8     db.SaveChanges();
 9
10     //表连接
11     var list = db.Set<Product>().Include("Orders").ToList();

6、数据库关系图

时间: 2025-01-06 21:11:19

EntityFramework之一对多关系(三)的相关文章

Web APi之EntityFramework【CRUD】(三)

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 前言 之前我们系统学习了EntityFramework,个人觉得有些东西不能学了就算完了,必须要学以致用,在Web API上也少不了增(C).删(D).改(U).查(R).鉴于此,我们通过EF来实现Web API上的增删改查. 之前对于EF的基

Web API 1之EntityFramework【CRUD】(三)

前言 之前我们系统学习了EntityFramework,个人觉得有些东西不能学了就算完了,必须要学以致用,在Web API上也少不了增(C).删(D).改(U).查(R).鉴于此,我们通过EF来实现Web API上的增删改查. 之前对于EF的基本操作都是很零散的,我们应该对于CRUD都是通过完整封装来实现,并且也显得比较专业,接下来首先对EF利用Responsitory仓储模式进行完整封装. EntityFramework完整封装 我们建立一个Core(核心类库),里面存放有关EF的完成封装.

Makefile 7——自动生成依赖关系 三颗星

后面会介绍gcc获得源文件依赖的方法,gcc这个功能就是为make而存在的.我们采用gcc的-MM选项结合sed命令.使用sed进行替换的目的是为了在目标名前加上"objs/"前缀.gcc的-E选项,预处理.在生成依赖关系时,其实并不需要gcc编译源文件,只要预处理就可以获得依赖关系了.通过-E选项,可以避免生成依赖关系时gcc发出警告,以及提高依赖关系的生成效率. 现在,已经找到自动生成依赖关系的方法了,那么如何将其整合到我们complicated项目的Makefile中呢?自动生成

实战-JavaWweb的Servlet和Filter运行关系(三)

本文继续实践"实战-JavaWweb的Servlet和Filter运行关系(一) "一文中留下的问题. 问题二: 在Filter没有执行chain.doFilter(request,response)方法的时候,response对象输出的内容有那些部分组成的. 在(文一)的基础上对RequestFilter做了略微改动,改动部分如下: 图c-1 说明:请求TestServlet,如何没有参数"p"则不执行china.doFilter方法,如果存在则执行. 下面对这两

EntityFramework 更新数据库字段的三种方法

例: 实体类: public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public TestDbContext() : base() { } } public class Test { public long ID { get; set; } public string Name { get; set; } public string Email { get; set; } public

EntityFramework之多对多关系(四)

上篇介绍了一对多关系,下面介绍下多对多关系代码编写. 1.新建model实体,User是用户类,Role是角色类,由于是多对多关系,必须得有一个中间类,所以产生了UserRole类 1 public class User 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5 6 public virtual ICollection<UserRole> UserRoles { set; get; } 7 }

Makefile学习7————自动生成依赖关系 三颗星

后面会介绍gcc获得源文件依赖的方法,gcc这个功能就是为make而存在的.我们采用gcc的-MM选项结合sed命令.使用sed进行替换的目的是为了在目标名前加上"objs/"前缀.gcc的-E选项,预处理.在生成依赖关系时,其实并不需要gcc编译源文件,只要预处理就可以获得依赖关系了.通过-E选项,可以避免生成依赖关系时gcc发出警告,以及提高依赖关系的生成效率. 现在,已经找到自动生成依赖关系的方法了,那么如何将其整合到我们complicated项目的Makefile中呢?自动生成

Python面向对象(类之间的关系)(三)

类与类之间的关系 在我们的世界中事物和事物之间总会有一些联系. 在面向对象中. 类和类之间也可以产生相关的关系 1. 依赖关系 执行某个动作的时候. 需要xxx来帮助你完成这个操作. 此时的关系是最轻的. 随时可以更换另外一个东西来完成此操作 class Plant: def __init__(self,zhonglei,xue,gongjili): self.zhonglei = zhonglei self.xue = xue self.gongjili = gongjili def da(s

EntityFramework Code-First 简易教程(三)-------数据库初始化

现在我们来学习,当数据库初始化的时候,Code First怎样设置数据库的名字. 下面的图显示了数据库初始化的工作流程,根据传入给context基类的构造函数的参数来初始化: 根据上面的图,context基类的构造函数可以传入如下参数: 无参数 参数为数据库名称 参数为连接字符串 无参数的构造函数: 如果不传参数给context基类的构造函数,它就会在我们本地创建一个以{命名空间}.{Context类名}为名字的数据库.比如下面代码会创建一个名字为SchoolDataLayer.Context的