1.一对一关系(one to one)
1.1DataAnnotations方式
实体:书本实体,版本信息实体,一本书只能有一个版本号,版本号在没有书出版的情况下是无意义的
public class Book { /// <summary> /// Id,主键 /// </summary>
[Key] public int BookID { get; set; } /// <summary> /// 书籍名称 /// </summary> public string Name { get; set; } /// <summary> /// 书籍类型 /// </summary> public string Category { get; set; } /// <summary> /// 出版数量 /// </summary> public int Numberofcopies { get; set; } /// <summary> /// 作者Id /// </summary> public int AuthorID { get; set; } /// <summary> /// 书籍价格 /// </summary> public decimal Price { get; set; } /// <summary> /// 出版日期 /// </summary> public DateTime PublishDate { get; set; } /// <summary> /// 评级 /// </summary> public string Rating { get; set; } /// <summary> /// 版本号Id /// </summary> public int VersionId { get; set; } /// <summary> /// 一对一版本号信息 /// </summary> public PublishInfo publish { get; set; } /// <summary> /// 作者信息 /// </summary> public Author author { get; set; } } public class PublishInfo { /// <summary> /// 版本Id /// </summary>
[Key]
[ForeignKey("book")] 设置此字段为Book的外键 public int VersionId { get; set; } /// <summary> /// 版本号 /// </summary> public string VersionNum { get; set; } /// <summary> /// 出版社名称 /// </summary> public string PressName { get; set; } /// <summary> /// 关联的书本信息 /// </summary> public virtual Book book { get; set; } }
说明:
[ForeignKey("book")] 为设置外键,设置了版本信息的主键为书本实体的外键,在使用DataAnnotations方式的时候,记得要引用“System.ComponentModel.DataAnnotations”和“System.ComponentModel.DataAnnotations.Schema”命名空间
1.2Fluent API方式
在以上实体的基础上添加两个映射类代码如下:
public PublishInfoMap() { this.HasKey(p => p.VersionId); this.Property(p => p.VersionId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(p => p.VersionNum).HasColumnType("nvarchar").HasMaxLength(50); this.Property(p => p.PressName).HasColumnType("nvarchar").HasMaxLength(100); this.ToTable(" PublishInfo"); this.HasRequired(p => p.book).WithRequiredDependent(p => p.publish); } public BookMap() { this.HasKey(b => b.BookID).Property(b => b.BookID).HasColumnName("B_Id"); this.Property(b => b.PublishDate).HasColumnType("datetime").IsRequired(); this.Property(b => b.Price).HasColumnType("decimal").IsRequired(); this.Property(b => b.Name).HasColumnType("nvarchar").HasMaxLength(200).IsRequired(); this.Property(b => b.Rating).HasColumnType("nvarchar").HasMaxLength(5).IsRequired(); this.Property(b => b.Category).HasColumnType("nvarchar").HasMaxLength(50).IsRequired(); this.HasRequired(b => b.author).WithMany(b => b.books).HasForeignKey(b => b.AuthorID); this.ToTable("Book"); }
说明:
this.HasRequired(p => p.book).WithRequiredDependent(p => p.publish);
此段代码设置了两张表的一对一映射关系
2.一对多关系(one to More)
实体:一本书只能有一个作者,一个作者可以有多本数
public class Book { /// <summary> /// Id,主键 /// </summary> public int BookID { get; set; } /// <summary> /// 书籍名称 /// </summary> public string Name { get; set; } /// <summary> /// 书籍类型 /// </summary> public string Category { get; set; } /// <summary> /// 出版数量 /// </summary> public int Numberofcopies { get; set; } /// <summary> /// 作者Id /// </summary> public int AuthorID { get; set; } /// <summary> /// 书籍价格 /// </summary> public decimal Price { get; set; } /// <summary> /// 出版日期 /// </summary> public DateTime PublishDate { get; set; } /// <summary> /// 评级 /// </summary> public string Rating { get; set; } /// <summary> /// 版本号Id /// </summary> public int VersionId { get; set; } /// <summary> /// 一对一版本号信息 /// </summary> public PublishInfo publish { get; set; } /// <summary> /// 作者信息 /// </summary> public Author author { get; set; } } public class Author { /// <summary> /// 主键Id /// </summary> public int AuthorID { get; set; } /// <summary> /// 姓名 /// </summary> public string Name { get; set; } /// <summary> /// 性别 /// </summary> public int Sex { get; set; } /// <summary> /// 国籍 /// </summary> public string Country { get; set; } public virtual ICollection<Book> books { get; set; } }
2.1DataAnnotations方式
[ForeignKey("AuthorID")]
public Author author { get; set; }
在book实体上设置以上代码
2.2Fluent Api方式
public BookMap() { this.HasKey(b => b.BookID).Property(b => b.BookID).HasColumnName("B_Id"); this.Property(b => b.PublishDate).HasColumnType("datetime").IsRequired(); this.Property(b => b.Price).HasColumnType("decimal").IsRequired(); this.Property(b => b.Name).HasColumnType("nvarchar").HasMaxLength(200).IsRequired(); this.Property(b => b.Rating).HasColumnType("nvarchar").HasMaxLength(5).IsRequired(); this.Property(b => b.Category).HasColumnType("nvarchar").HasMaxLength(50).IsRequired(); this.HasRequired(b => b.author).WithMany(b => b.books).HasForeignKey(b => b.AuthorID); this.ToTable("Book"); } public AuthorMap() { this.ToTable("Author"); this.HasKey(a => a.AuthorID); this.Property(a => a.Name).HasColumnType("nvarchar").HasMaxLength(50); this.Property(a => a.Country).HasColumnType("nvarchar").HasMaxLength(30); this.HasMany(a => a.books).WithRequired(a => a.author).HasForeignKey(a => a.AuthorID); }
设置:
BookMap类和
AuthorMap类
this.HasRequired(b => b.author).WithMany(b => b.books).HasForeignKey(b => b.AuthorID);
this.HasMany(a => a.books).WithRequired(a => a.author).HasForeignKey(a => a.AuthorID);
数据迁移
启动迁移:Enable-Migrations;
添加迁移文件:Add-Migration Info(文件的名称)
迁移到数据库:Update-Database
说明:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。
请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: SQL Network Interfaces, error: 26 - 定位指定的服务器/实例时出错)”
若出现这个错误,需要指定要迁移的项目名称:Update-Database -StartUpProjectName "ContextConfig"(你要迁移的项目名称)
原文:https://www.cnblogs.com/PiaoYu/p/10287137.html