实体框架会创建与现有实体相关的新实体

时间:2019-04-29 09:53:26

标签: c# entity-framework entity-framework-core

我有Student个实体,其中有Class个(班级可以有很多学生)

这是我的Student.cs和StudentDto.cs

 public partial class Students
{
    public int Id { get; set; }
    public string FullName { get; set; }
    public int? FkClass { get; set; }
}

public class StudentsDTO
{
    public int Id { get; set; }
    public string FullName { get; set; }
    public int FkClass { get; set; }
    public int FkClassNavigationId { get; set; }
    public string FkClassNavigationTitle { get; set; }
}

当我创建新学生并从下拉列表中选择班级ID时,而不是使用该班级,而是创建了新班级(具有空值和随机ID)。 我不确定解决此错误的最佳方法在哪里?是Automapper,context.cs类中的问题还是我的add方法本身错了?

在我的服务中,我这样做:

public Students PostStudent(StudentsDTO item)
    {
        var sub = _mapper.Map<Students>(item);
        _repository.PostStudent(sub);
        return sub;
    }

,然后在存储库中执行以下操作:

 public void PostStudent(Students c)
    {
        this.museumContext.Add(c);
        this.museumContext.SaveChanges();
    }

Automapper.cs:

            CreateMap<Students, StudentsDTO>()
            .ReverseMap();

和上下文。

 modelBuilder.Entity<Students>(entity =>
        {
            entity.ToTable("students");
            entity.Property(e => e.Id).HasColumnName("id");
            entity.Property(e => e.FkClass).HasColumnName("fkClass");

            entity.Property(e => e.FullName)
                .HasColumnName("fullName")
                .HasMaxLength(255);

            entity.HasOne(d => d.FkClassNavigation)
                .WithMany(p => p.Students)
                .HasForeignKey(d => d.FkClass)
                .HasConstraintName("Include");
        });

有人可以帮助我了解如何解决此问题吗?

奇怪的是,如果我将var a = _classesService.GetClassById(s.FkClass);添加到控制器中,则可以正常工作。不是我要分配检索到的内容或任何东西。

[HttpPost]
    [AllowAnonymous]
    public IActionResult PostStudent([FromBody] StudentsDTO s)
    {
        if (!this.ModelState.IsValid)
        {
            return this.BadRequest(ModelState);
        }

        try
        {
            var a = _classesService.GetClassById(s.FkClass);
            var sub = this._service.PostStudent(s);
            return Ok();

        }
        catch (Exception err)
        {
            return BadRequest(err);
        }
    }

0 个答案:

没有答案