MVC 5 Entity Framework 6 Дублирование записей

У меня странная проблема с использованием Entity Framework 6 Model First в ASP.Net MVC 5.

У меня есть класс ученика и класс семьи. В семье может быть много учеников.

Я могу добавить семью без проблем, но когда я добавляю в эту семью ученика, он создает две записи с разными ключами.

Это мои модели:

     public partial class Family
{
    public Family()
    {
        this.Students = new HashSet<Student>();
        this.Contacts = new HashSet<Contact>();
    }

    public System.Guid FamilyId { get; set; }
    public string PayerType { get; set; }
    public bool ProblemAccount { get; set; }
    public bool Active { get; set; }
    public string CustomId { get; set; }
    public string FamilyName { get; set; }
    public string Note { get; set; }

    public virtual ICollection<Student> Students { get; set; }
    public virtual ICollection<Contact> Contacts { get; set; }
}

   public partial class Student
{
    public Student()
    {
        this.Phones = new HashSet<Phone>();
        this.Addresses = new HashSet<Address>();
        this.Classes = new HashSet<Class>();
    }

    public System.Guid StudentId { get; set; }
    public string Name { get; set; }
    public string Last { get; set; }
    public System.Guid FamilyFamilyId { get; set; }
    public string CustomId { get; set; }
    public string Email { get; set; }
    public bool MassEmail { get; set; }
    public string Gender { get; set; }
    public string Transportation { get; set; }
    public string School { get; set; }
    public Nullable<System.DateTime> StartDate { get; set; }
    public Nullable<System.DateTime> EndDate { get; set; }
    public Nullable<System.DateTime> BirthDate { get; set; }
    public bool Active { get; set; }
    public string Note { get; set; }
    public bool Citizenship { get; set; }

    public virtual Family Family { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<Phone> Phones { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
    public virtual ICollection<Class> Classes { get; set; }
}

Это мой контроллер для добавления ученика:

   public async Task<ActionResult> AddNewStudent(Guid FamilyId, NewRegistrationViewModel model)
    {

        model.Student.StudentId = Guid.NewGuid();
        model.Student.FamilyFamilyId = FamilyId;
        db.Students.Add(model.Student);

        await db.SaveChangesAsync();

        return View();
    }

Единственный способ избежать дублирования - это не создавать новый guid для StudentId. Если я прокомментирую первую строку своего контроллера AddNewStudent, она сохранится нормально, но без руководства и, конечно, мы этого не хотим.

Нравится:

  public async Task<ActionResult> AddNewStudent(Guid FamilyId, NewRegistrationViewModel model)
    {

        //model.Student.StudentId = Guid.NewGuid();
        model.Student.FamilyFamilyId = FamilyId;
        db.Students.Add(model.Student);

        await db.SaveChangesAsync();

        return View();
    }

person Jorge L Hernandez    schedule 12.11.2013    source источник


Ответы (1)


Вам необходимо использовать какой-либо тип сопоставления базы данных с помощью Настройка / сопоставление свойств и типов с помощью Fluent API или аннотации данных.

Аннотации к данным будут выглядеть примерно так.

[Table("Family")
public partial class Family
{
[Key]
public System.Guid FamilyId { get; set; }
---

Fluent Mapping выглядит так и находится в OnModelCreating (возможно, в YourDbContext.cs)

modelBuilder.Entity<Family>().HasKey(t => t.FamilyId);
person stink    schedule 14.11.2013
comment
То есть, если это был Code First, но эта модель была сгенерирована Model First. - person Jorge L Hernandez; 01.12.2013