实体框架 - 无法确定主要目标

时间:2016-10-04 16:52:20

标签: c# entity-framework

  

重要提示:我发现了很多关于 Unable的类似问题   确定关系的主要结束。多个添加   SO中的实体可能具有相同的主键例外。我阅读并明白了什么   这是什么意思,为什么会发生。

但是,我无法找到问题隐藏在哪里,特别是在我的模型中。如果你能指出究竟做错了什么,我将非常感激。 这里的模型:

public class Faculty : Entity
{
    public string Name { get; set; }
    public string Acronym { get; set; }
    public string Description { get; set; }

    public ICollection<Department> Departments { get; set; }
    public ICollection<Specialty> Specialties { get; set; }
    public ICollection<Student> Students { get; set; }
    public ICollection<Employee> Employees { get; set; }
}

public class Department : Entity
{
    public string Name { get; set; }
    public string Acronym { get; set; }
    public string Description { get; set; }
    public Guid ? FacultyId { get; set; }
    public Faculty Faculty { get; set; }

    public ICollection<Subject> Subjects { get; set; }
    public ICollection<Employee> Employees { get; set; }
    public ICollection<Specialty> Specialties { get; set; }
}

public class Specialty : Entity
{
    public string Name { get; set; }
    public string Acronym { get; set; }
    public string Description { get; set; }
    public ICollection<Student> Students { get; set; }
    public Guid FacultyId { get; set; }
    public Faculty Faculty { get; set; }
    public Guid DepartmentId { get; set; }
    public Department Department { get; set; } 
}

配置:映射

public class DepartmentConfiguration : EntityConfiguration<Department>
{
    public DepartmentConfiguration()
    {
        Property(p => p.Name).IsRequired().HasMaxLength(200);
        Property(p => p.Acronym).IsRequired().HasMaxLength(5);
        Property(p => p.Description).HasMaxLength(1000);

        HasMany(p => p.Subjects).WithRequired(p => p.Department);
        HasMany(p => p.Employees).WithOptional(p => p.Department);
        HasMany(p => p.Specialties).WithRequired(p => p.Department);
    }
}

public class SpecialtyConfiguration : EntityConfiguration<Specialty>
{
    public SpecialtyConfiguration()
    {
        Property(p => p.Name).IsRequired().HasMaxLength(200);
        Property(p => p.Acronym).IsRequired().HasMaxLength(5);
        Property(p => p.Description).HasMaxLength(1000);
        HasMany(p => p.Students).WithRequired(p => p.Specialty);
    }
}

public class FacultyConfiguration : EntityConfiguration<Faculty>
{
    public FacultyConfiguration() : base()
    {
        Property(p => p.Name).IsRequired().HasMaxLength(200);
        Property(p => p.Acronym).IsRequired().HasMaxLength(5);
        Property(p => p.Description).HasMaxLength(1000);

        HasMany(p => p.Departments).WithOptional(p => p.Faculty);
        HasMany(p => p.Specialties).WithRequired(p => p.Faculty);
        HasMany(p => p.Employees).WithOptional(p => p.Faculty);
        HasMany(p => p.Students).WithRequired(p => p.Faculty);
    }
}

关于部门和专业部门之间关系的例外说明。

  

无法确定主要结尾   'EMIS.DAL.Context.Department_Specialties'的关系。多个添加   实体可能具有相同的主键。

2 个答案:

答案 0 :(得分:1)

解决了这个问题。映射中没有错误。我忘记了,只有在将数据保存到数据库时才添加DatabaseGeneratedOption.Identity PK。但是,我试图将Special添加到ID等于null的Department,直到DB中不存在。

答案 1 :(得分:0)

有时这是必要的。您可以在一个事务中包装多个相关的数据库操作。在事务内部,您调用SaveChanges(),并且数据库将像已被更新一样工作(您可以访问生成的ID等),但是除非调用Commit(),否则所有更改将在事务对象退出后回滚。范围。

例如,

using (var transaction = myDbContext.BeginTransaction())
{
  InsertFirstThing();
  myDbContext.SaveChanges();

  InsertSecondThing();
  myDbContext.SaveChanges();

  if (EverythingWasSuccessful())
  {
    transaction.Commit();
  }
}