c# - Entity Framework 中未填充外键

标签 c# asp.net-core .net-core entity-framework-core

我无法正确更新应该链接我的两个实体的表。更详细地解释...我有两个实体, 老师 ,其关系为:

  • 老师可以分配到多个类(class)
  • 类(class)只能有一位老师。

  • 下面是这两个实体。
    public class Teacher
    {
        [Required, Key]
        public Guid Id { get; private set; }
        [StringLength(50)]
        public string Name { get; set; }
        public string Email { get; set; }
        public List<Class> Classes = new List<Class>();
    
        public Teacher()
        {
            Id = new Guid();
        }
    
        public Teacher(Guid id)
        {
            Id = id;
        }
    
        public void AssignClass(Class newClass)
        {
            Classes.Add(newClass);
        }
    }
    
    public class Class
    {
        [Required, Key]
        public Guid Id { get; private set; }
        [Required, StringLength(20)]
        public string Name { get; set; }
        [Required, Range(5, 30)]
        public int Capacity { get; set; }
        public Teacher Teacher { get; set; }
        public IEnumerable<StudentClass> StudentClasses { get; set; }
    
        public Class()
        {
            Id = new Guid();
        }
    
        public Class(Guid id)
        {
            Id = id;
        }
    }
    

    当我生成迁移时,我按预期在 Classes 表中得到了一个外键 TeacherId 。这是 SQL:
    CREATE TABLE [dbo].[Classes] (
    [Id]        UNIQUEIDENTIFIER NOT NULL,
    [Name]      NVARCHAR (20)    NOT NULL,
    [Capacity]  INT              NOT NULL,
    [TeacherId] UNIQUEIDENTIFIER NULL,
    CONSTRAINT [PK_Classes] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Classes_Teachers_TeacherId] FOREIGN KEY ([TeacherId]) REFERENCES [dbo].[Teachers] ([Id])
    );
    GO
    CREATE NONCLUSTERED INDEX [IX_Classes_TeacherId]
    ON [dbo].[Classes]([TeacherId] ASC);
    

    我的类派生自 DBContext 看起来像:
    public class SchoolDatabaseContext : DbContext
    {
        public DbSet<Student> Students { get; private set; }
        public DbSet<Class> Classes { get; private set; }
        public DbSet<Teacher> Teachers { get; private set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
    
        }
    
        public SchoolDatabaseContext(DbContextOptions<SchoolDatabaseContext> options) : base(options)
        {
        }
    }
    

    这些实体还没有配置。我使用 DI 将 DbContext 提供给 Controller ,一切看起来都很好。

    我的目标是 DDD 类型的结构,但为了使这个问题更容易调试,我已经把所有东西都剥离回 Controller ,所以它基本上是...... Controller => DbContext

    这是我在 Controller 中的代码:
    [HttpPost]
        [Route("assign-teacher-to-class")]
        public async Task<IActionResult> AssignClass([FromBody] AssignTeacherToClass assignTeacherToClass)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
    
            var teacher = await schoolDatabaseContext.Teachers.FindAsync(assignTeacherToClass.TeacherId);
    
            var classToAssign = await schoolDatabaseContext.Classes.FindAsync(assignTeacherToClass.ClassId);
    
    
            teacher.AssignClass(classToAssign);
    
            schoolDatabaseContext.Entry(teacher).State = EntityState.Modified;
    
            await schoolDatabaseContext.SaveChangesAsync();
    
            return Ok(teacher);
    }
    

    当我通过帖子正文中的 id 进行调试时,它们被正确分配给 DTO AssignClass 并且调用 DbContext 以查找每种类型(教师和类(class))的数据很好。然后我在我的老师类型中调用一个方法将类添加到 列表类 属性(请参阅开头的教师实体代码以供引用),然后我使用 DbContext 方法和 问题定义在这里: 保存更改在调试/完成时,数据库中的 TeacherId 没有任何阶段进行更新。我已经尝试了所有我能想到的方法,例如以不同的方式实例化集合、更改集合类型、寻找可能有助于以这种方式映射这些实体的配置、剥离所有额外层、更改属性和类的可访问性等等。

    任何帮助都将不胜感激,因为我在这个问题上有点失败,我觉得这种关系应该是相当直接的。我实际上能够让我的多对多工作与桥梁类(class)一起工作,所以我很惊讶被困在这个类(class)上:(

    谢谢

    最佳答案

    试试这个:

     var teacher = await schoolDatabaseContext.Teachers.Include(x => x.Classes).SingleOrDefaultAsync(x => x.Id == assignTeacherToClass.TeacherId);
    

    否则我认为 teacher.Classes 不会被 DbContext 跟踪。

    关于c# - Entity Framework 中未填充外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57718481/

    相关文章:

    c# - c# 中的除法不符合我的预期

    c# - WPF 控件的条件加载

    c# - 从 FTP 服务器下载最新文件

    asp.net - 使用 Asp.Net 5 实时重新加载

    c# - .NetCore 和 SoapCore 如何进行身份验证

    visual-studio - DocFX 为不同文件夹中的项目生成文档

    c# - Windows.System.UserProfile.UserInformation.NameAccessAllowed 总是返回 false

    azure - 将消息放入队列的代码(可能)有问题

    c# - PostBuild 事件中的 .NET Core Assembly.LoadFile

    c# - Azure B2C 登录然后返回会引发错误