2017-02-05 7 views
0

Entity Frameworkを使って生徒に本を追加しようとすると「Multiplicity constraint violated」例外がスローされますロール 'Student_LendedBooks_Source'の関係 'LibarySystem.DataModel.Student_LendedBooks'の多重度は1または0..1です。 "どうすれば修正できますか?私はEntity Frameworkについてよく知らない。何か助けてくれてありがとう。多重度制約に違反しています。関係「LibarySystem.DataModel」のロール「Student_LendedBooks ...」は多重度1または0..1を持っています

DbContextクラス:

public class DbContext : System.Data.Entity.DbContext { 

    public DbSet<Student> Students { get; set; } 
    public DbSet<Book> Books { get; set; } 

} 

Studentクラス:

public class Student { 

    public Student() { 
     LendedBooks = new HashSet<Book>(); 
    } 

    [Key] 
    public string PESEL { get; set; } 

    public string Name { get; set; } 
    public string SecondName { get; set; } 
    public string Surname { get; set; } 
    public string Class { get; set; } 
    public virtual ICollection<Book> LendedBooks { get; set; } 

} 

Bookクラス:

public class Book { 

    public Book() { 
     IsLend = false; 
    } 

    [Key] 
    public string CatalogueNumber { get; set; } 

    public string StudentPesel { get; set; } 
    public virtual Student Student { get; set; } 
    public string Name { get; set; } 
    public string Author { get; set; } 
    public DateTime? DateOfLend { get; set; } 
    public DateTime? DateOfReturn { get; set; } 
    public bool IsLend { get; set; } 

} 

とメソッドを追加します。

public static void AddBookToStudent(Student student, Book book) { 
     using (var context = new DbContext()) { 
      var findStudent = context.Students.Find(student.PESEL); 
      var findBook = context.Books.Find(book.CatalogueNumber); 
      if (findBook != null) { 
       findBook.DateOfLend = DateTime.Today; 
       findBook.DateOfReturn = book.DateOfLend + new TimeSpan(7, 0, 0, 0); 
       findBook.StudentPesel = findStudent?.PESEL; 
       findBook.Student = findStudent; 
       findBook.IsLend = true; 
      } 
      findStudent?.LendedBooks.Add(book); 
      context.SaveChanges(); 
     } 
    } 
+0

bookを置き換え、書き込んだとして、findBook != nullブロック内findStudent?.LendedBooks.Add(findBook)コールを移動して、あなたには、いくつかの 'Student'に同じ' Book'を追加しようとしていますか? –

答えて

0

あなたはBookに一つだけStudent

を追加することを意味している場合、私はあなたがそこにタイプミスを持っていると信じてい:

findStudent?.LendedBooks.Add(book); 

ことになるはずです:

findStudent?.LendedBooks.Add(findBook); 
0

このコードには複数の設計上の問題があります。しかし初めには、「Lended Book」は学生と書籍の両方に接続する別のエンティティでなければなりません(FK)。それは「関連テーブル」になります。

public class Student { 

    public Student() { 
     LendedBooks = new List<LendedBook>(); 
    } 

    [Key] 
    public string PESEL { get; set; } 

    public string Name { get; set; } 
    public string SecondName { get; set; } 
    public string Surname { get; set; } 
    public string Class { get; set; } 

    public virtual List<LendedBook> LendedBooks { get; set; } 
} 

public class Book { 

    public Book() { 
    } 

    [Key] 
    public string CatalogueNumber { get; set; } 

    public string Name { get; set; } 
    public string Author { get; set; } 
} 

public class LendedBook 
{ 
    public DateTime DateOfLend { get; set; } 
    public DateTime? DateOfReturn { get; set; } 

    // TODO: Annotations, ForeignKey 
    public string StudentPesel { get; set; } 
    public virtual Student Student { get; set; } 

    // TODO: Annotations, ForeignKey 
    public string CatalogueNumber { get; set; } 
    public virtual Book Book { get; set; } 
} 

public static void AddBookToStudent(Student student, Book book) { 
    using (var context = new DbContext()) { 
     var findStudent = context.Students.Find(student.PESEL); 
     var findBook = context.Books.Find(book.CatalogueNumber); 

     if (findBook != null) { 
      // Something like ... 
      findStudent?.LendedBooks.Add(new LendedBook() { 
       DateOfLend = DateTime.Today, 
       DateOfReturn = book.DateOfLend + new TimeSpan(7, 0, 0, 0), 
       Book = findBook 
      }); 

      context.SaveChanges(); 
     } 
    } 
} 
+0

'Book'が一度に1つの' Student'に貸し出すことができない場合、これは間違っています。 – Moho

+0

非常にそうでないシナリオ –

+0

一度に1人の学生にのみ本を貸したいのですが、1人の学生が複数の本を借りることができます。 –

0

あなたはfindBook.Studentプロパティを正しく設定してから、を追加してください、メソッドパラメータはfindStudent.LendedBooksになります。その本に別のStudentが設定されていると、あなたは悪い時を過すでしょう。

findBook

関連する問題