EF Code First дает проблемы во внешних ключах - PullRequest
1 голос
/ 27 августа 2011
public class ParikshaContext :DbContext
{
    public ParikshaContext()
    {

       Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ParikshaContext>());

    }
    public DbSet<UserDetail> UserDetails { get; set; }
    public DbSet<Standard> Standards { get; set; }
    public DbSet<Subject> Subjects { get; set; }
    public DbSet<QuestionDescriptor> QuestionDescriptors { get; set; }
    public DbSet<QuestionBrief> QuestionBriefs { get; set; }
    public DbSet<QuestionCustom> QuestionCustoms { get; set; }
    public DbSet<QuestionChoice> QuestionChoices { get; set; }
    public DbSet<QuestionMatch> QuestionMatches { get; set; }
    public DbSet<Test> Tests { get; set; }
    public DbSet<Test_Question> Test_Questions { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<QuestionCustom>().ToTable("Custom");
        modelBuilder.Entity<QuestionBrief>().ToTable("Brief");
        modelBuilder.Entity<QuestionMatch>().ToTable("Match");
        modelBuilder.Entity<QuestionChoice>().ToTable("Choice");
    }       
} 

public class QuestionDescriptor
{

    public int QuestionDescriptorId { get; set; } 

    public int StandardId { get; set; }
    [ForeignKey("StandardId")]
    public virtual Standard Standard { get; set; }

    public int SubjectId { get; set; }
    [ForeignKey("SubjectId")]
    public virtual Subject Subject { get; set; }

    public int Rating { get; set; }
    public int Difficulty { get; set; }

    public DateTime DateOfCreation{get;set;}

    public int UserDetailId { get; set; }     
    [ForeignKeyAttribute("UserDetailId")]
    public virtual UserDetail Creator { get; set; }

}

public class QuestionBrief : QuestionDescriptor
{
    public String QuestionText { get; set; }
    public String Answer { get; set; }
    //true for fill in the blanks and false for a loing answers
    public bool Short { get; set; }
}

public class Standard
{
    public int StandardId { get; set; }
    public String StandardName { get; set; }

}

public class Subject
{
    public int SubjectId { get; set; }
    public String SubjectName { get; set; }
    public String SubjectCategory { get; set; }        

  //  public int StandardId { get; set; }
  //  [ForeignKey("StandardId")]
   // public virtual Standard Standard { get; set; }
}

public class Test
{

    public int TestID { get; set; }
    public DateTime DateOfCreation { get; set; }    

    public String StandardName { get; set; }
    public String SubjectName { get; set; }
    public String SubjectCategory { get; set; }

//    public int UserDetailId { get; set; }
//    [ForeignKey("UserDetailId")]
 //   public virtual UserDetail Creator { get; set; }


}

public class Test_Question
{

    public int Test_QuestionID { get; set; }     

    public int TestId { get; set; }
    [ForeignKey("TestId")]
    public virtual Test Test { get; set; }

    public int QuestionDescriptorId { get; set; }
    [ForeignKey("QuestionDescriptorId")]
    public virtual QuestionDescriptor Question { get; set; }
}

public class UserDetail
{

    public int UserDetailId { get; set; }

    [Required]
    [MaxLength(10, ErrorMessage = "UserName must be 10 characters or less"), MinLength(5)]
    public String Name { get; set; }

    [Required]        
    public String Password { get; set; }
    public String UserRole { get; set; }
    public DateTime DateOfCreation{  get; set;}    
}

//Match,Custom,Choice classes have been omitted for lack of space (which sounds stupid when i look at the amount of code i have pasted )

У меня две проблемы: -

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

  2. , если я сделаю соотношение внешнего ключа между test и usedetail, это дает мне вышеуказанную проблему для отображения таблицы tst_question.

Также, поскольку ясначала новичок в коде EF, пожалуйста, укажите на мои ошибки. вся помощь и обсуждение приветствуются.

1 Ответ

2 голосов
/ 28 августа 2011

По умолчанию EF создаст внешние ключи, будет cascade delete.В вашей модели, если вы удаляете Standard, существует несколько путей для удаления QuestionDescriptor.

Стандарт -> QuestionDescriptor

и

Стандарт -> Тема -> ВопросДескриптор

Именно поэтому SQL-сервер не позволяет вам это делать.См. этот ответ для получения более подробной информации

Что вы можете сделать, это явно указать EF создавать внешние ключи без cascade delete. Но это может создать проблемы с целостностью данных.Поэтому убедитесь, что вы понимаете последствия.

Что вы можете сделать, это настроить отношения, используя свободный API с WillCascadeOnDelete(false).

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  //other mappings

      modelBuilder.Entity<Subject>()
        .HasRequired(subject => subject.Standard).WithMany()
        .HasForeignKey(subject => subject.StandardId)
        .WillCascadeOnDelete(false);
}
...