基于EF Core 7构建含一对多关系的数据库模型及迁移咨询
使用Entity Framework Core 7构建指定数据库架构的实体模型与迁移配置
一、实体类定义
对应数据库表创建实体类,包含属性与导航属性以映射表关系:
using System.ComponentModel.DataAnnotations; public class Event { public Guid Id { get; set; } [StringLength(50)] public string Name { get; set; } = string.Empty; public Guid ContactId { get; set; } [StringLength(1500)] public string Description { get; set; } = string.Empty; // 关联注册记录的导航属性 public ICollection<Registration> Registrations { get; set; } = new List<Registration>(); // 关联积分记录的导航属性 public ICollection<Credit> Credits { get; set; } = new List<Credit>(); } public class Contact { public Guid Id { get; set; } [StringLength(20)] public string GivenName { get; set; } = string.Empty; [StringLength(20)] public string SirName { get; set; } = string.Empty; [StringLength(128)] public string EMail { get; set; } = string.Empty; [StringLength(12)] public string Phone { get; set; } = string.Empty; // 关联自身注册记录的导航属性(一对多) public ICollection<Registration> Registrations { get; set; } = new List<Registration>(); // 关联自身积分记录的导航属性(一对多) public ICollection<Credit> Credits { get; set; } = new List<Credit>(); } public class Registration { public Guid Id { get; set; } public Guid ContactId { get; set; } public Guid EventId { get; set; } // 关联联系人的导航属性 public Contact Contact { get; set; } = null!; // 关联活动的导航属性 public Event Event { get; set; } = null!; } public class Credit { public Guid Id { get; set; } public Guid ContactId { get; set; } public Guid EventId { get; set; } public DateTime Timestamp { get; set; } public int Score { get; set; } // 关联联系人的导航属性 public Contact Contact { get; set; } = null!; // 关联活动的导航属性 public Event Event { get; set; } = null!; }
二、DbContext配置
通过Fluent API配置表关系、字段约束与唯一索引:
using Microsoft.EntityFrameworkCore; public class AppDbContext : DbContext { // 数据库集对应各表 public DbSet<Event> Events { get; set; } public DbSet<Contact> Contacts { get; set; } public DbSet<Registration> Registrations { get; set; } public DbSet<Credit> Credits { get; set; } // 配置数据库连接(替换为你的连接字符串) protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("YourDatabaseConnectionString"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置Registration表的一对多关系与唯一约束 modelBuilder.Entity<Registration>() .HasOne(r => r.Contact) .WithMany(c => c.Registrations) .HasForeignKey(r => r.ContactId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity<Registration>() .HasOne(r => r.Event) .WithMany(e => e.Registrations) .HasForeignKey(r => r.EventId) .OnDelete(DeleteBehavior.Cascade); // 为ContactId+EventId设置唯一索引 modelBuilder.Entity<Registration>() .HasIndex(r => new { r.ContactId, r.EventId }) .IsUnique(); // 配置Credit表的一对多关系与唯一约束 modelBuilder.Entity<Credit>() .HasOne(cr => cr.Contact) .WithMany(c => c.Credits) .HasForeignKey(cr => cr.ContactId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity<Credit>() .HasOne(cr => cr.Event) .WithMany(e => e.Credits) .HasForeignKey(cr => cr.EventId) .OnDelete(DeleteBehavior.Cascade); // 为ContactId+EventId+Timestamp设置唯一索引 modelBuilder.Entity<Credit>() .HasIndex(cr => new { cr.ContactId, cr.EventId, cr.Timestamp }) .IsUnique(); } }
三、执行迁移生成数据库
- 在包管理器控制台(PMC)中生成初始迁移文件:
Add-Migration InitialCreate
- 将迁移应用到数据库,自动创建表与约束:
Update-Database
关键说明
- 删除行为:
OnDelete(DeleteBehavior.Cascade)表示删除主表记录时自动删除关联子表数据,可根据业务需求改为Restrict或SetNull。 - 字符串约束:实体类中用
[StringLength]或DbContext中用HasMaxLength均可,两种方式等效。 - 唯一索引:通过
HasIndex(...).IsUnique()实现复合字段的唯一约束,完全匹配需求中的重复提交限制。
内容的提问来源于stack exchange,提问作者Stephen Lee Parker
相关产品推荐
相关产品推荐

