摘要:中关系映射也是一个很关键的内容,关系映射和属性映射一样,也是在中配置映射。一个客户可以有多个订单,但一个订单只能属于一个客户,所以我们用到了中的,一个客户又存在多个订单,因此也使用到了同时表中有作为外键,因此我们用到了。
EF中关系映射也是一个很关键的内容,关系映射和属性映射一样,也是在 OnModelCreating 中配置映射。EF中的关系映射有如下三种:
One-to-Many Relationship(一对多)
Many-to-Many Relationship(多对多)
One-to-One Relationship(一对一)
我们今天先讲解 One-to-Many Relationship(一对一关系)
零、创建所需类所有实体类公用的抽象基类
public abstract class Base { public int Id { get; set; } public DateTime CreateTime { get; set; } public DateTime ModifiedTime { get; set; } }
客户类和订单类
public class Customer : Base { public string Name { get; set; } public string Email { get; set; } public virtual ICollection一、One-to-Many RelationshipOrders { get; set; } } public class Order : Base { public byte Quanatity { get; set; } public int Price { get; set; } public int CoustomerId { get; set; } public virtual Customer Customer { get; set; } }
创建Map映射类
在编写代码之前,我们先分析一下客户和订单的关系。一个客户可以有多个订单,但一个订单只能属于一个客户,所以我们用到了EF中的 HasRequired,一个客户又存在多个订单,因此也使用到了 WithMany ,同时 Order 表中有 CustomerId 作为外键,因此我们用到了 HasForeignKey 。根据我们的分析,编写代码如下:
public class CustomerMap : EntityTypeConfiguration{ public CustomerMap() { //数据库映射的表名称 ToTable("Customer"); //主键 HasKey(p => p.Id); //属性映射的字段属性 Property(p => p.Name).HasColumnType("VARCHAR").HasMaxLength(50).IsRequired(); Property(p => p.Email).HasColumnType("VARCHAR").HasMaxLength(50).IsRequired(); Property(p => p.CreateTime); Property(p => p.ModifiedTime); //设置关系 HasMany(t => t.Orders).WithRequired(t => t.Customer).HasForeignKey(t => t.CoustomerId).WillCascadeOnDelete(false); } } public class OrderMap : EntityTypeConfiguration { public OrderMap() { ToTable("Order"); HasKey(p => p.Id); Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); Property(p => p.Quanatity); Property(p => p.Price); Property(p => p.CoustomerId); Property(p => p.CreateTime); Property(p => p.ModifiedTime); } }
注册映射类
protected override void OnModelCreating(DbModelBuilder modelBuilder) { var typeToRegister = Assembly.GetExecutingAssembly().GetTypes() .Where(t => !String.IsNullOrEmpty(t.Namespace)) .Where(t => t.BaseType != null && t.BaseType.IsGenericType && t.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)); foreach(var type in typeToRegister) { dynamic configurationInstance = Activator.CreateInstance(type); modelBuilder.Configurations.Add(configurationInstance); } base.OnModelCreating(modelBuilder); }
注1:在实际项目中需要编写很多的实体类,如果将所有实体类的映射直接写在 OnModelCreating 中会造成代码臃肿,不易维护,因此我们在这里将每个类的映射写在对应的映射文件中,最后再将每个类的映射类注册到 OnModelCreating 中注2:上述代码和描述是从客户的方向连编写的关系映射,如果以订单的角度来编写关系映射的话,只需删掉CustomerMap中的关系配置,在OrderMap中增加关系配置部分修改如下:
HasRequired(p => p.Customer).WithMany(p => p.Orders).HasForeignKey(p => p.CoustomerId).WillCascadeOnDelete(false);
运行控制台代码后,我们将在数据库看到表和表关系都被创建了:
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/61648.html
摘要:中关系映射也是一个很关键的内容,关系映射和属性映射一样,也是在中配置映射。一个客户可以有多个订单,但一个订单只能属于一个客户,所以我们用到了中的,一个客户又存在多个订单,因此也使用到了同时表中有作为外键,因此我们用到了。 EF中关系映射也是一个很关键的内容,关系映射和属性映射一样,也是在 OnModelCreating 中配置映射。EF中的关系映射有如下三种: One-to-Many...
摘要:一对一关系是中很复杂的关系,涉及了。我们以会员和订单为例,一个会员有可能有订单,也可能没有订单,但是一个订单绝对属于一个会员。使用可以使实体作为以来提,将包含关系的外键。四和我们最后一次修改和这种方法生成的数据库与第二种方法结果一样。 一对一关系是Entity Framework 中很复杂的关系,涉及了 HasOptional 、WithRequired 、 WithOptionalP...
摘要:一对一关系是中很复杂的关系,涉及了。我们以会员和订单为例,一个会员有可能有订单,也可能没有订单,但是一个订单绝对属于一个会员。使用可以使实体作为以来提,将包含关系的外键。四和我们最后一次修改和这种方法生成的数据库与第二种方法结果一样。 一对一关系是Entity Framework 中很复杂的关系,涉及了 HasOptional 、WithRequired 、 WithOptionalP...
摘要:这个第三张表被称为关联表或链接表,这张表中存存储了学生和课程的主键或被能够区分唯一性的字段。注在设置多对多关系的时候,如果不定义和将默认使用实体类型。 上一篇文章我们讲解了EF中的一对对多的关系映射,这篇文章我们讲解EF中的多对多(Many-to-Many Relationship)关系映射。这篇文章我们同样通过一个简单的例子来讲解多对多的关系映射。 零、自动生成关系表 故事:在一个学...
摘要:这个第三张表被称为关联表或链接表,这张表中存存储了学生和课程的主键或被能够区分唯一性的字段。注在设置多对多关系的时候,如果不定义和将默认使用实体类型。 上一篇文章我们讲解了EF中的一对对多的关系映射,这篇文章我们讲解EF中的多对多(Many-to-Many Relationship)关系映射。这篇文章我们同样通过一个简单的例子来讲解多对多的关系映射。 零、自动生成关系表 故事:在一个学...
阅读 2528·2021-11-16 11:53
阅读 2604·2021-07-26 23:38
阅读 1900·2019-08-30 15:55
阅读 1620·2019-08-30 13:21
阅读 3501·2019-08-29 17:26
阅读 3177·2019-08-29 13:20
阅读 774·2019-08-29 12:20
阅读 2345·2019-08-27 14:19