You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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();
    }
}

三、执行迁移生成数据库

  1. 在包管理器控制台(PMC)中生成初始迁移文件:
Add-Migration InitialCreate
  1. 将迁移应用到数据库,自动创建表与约束:
Update-Database

关键说明

  • 删除行为:OnDelete(DeleteBehavior.Cascade)表示删除主表记录时自动删除关联子表数据,可根据业务需求改为Restrict或SetNull。
  • 字符串约束:实体类中用[StringLength]或DbContext中用HasMaxLength均可,两种方式等效。
  • 唯一索引:通过HasIndex(...).IsUnique()实现复合字段的唯一约束,完全匹配需求中的重复提交限制。

内容的提问来源于stack exchange,提问作者Stephen Lee Parker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:02:20