【问题标题】:Multiplicity constraint violated. The role 'Student_LendedBooks...' of the relationship 'LibarySystem.DataModel' has multiplicity 1 or 0..1违反了多重性约束。关系“LibarySystem.DataModel”的角色“Student_LendedBooks...”具有多重性 1 或 0..1
【发布时间】:2017-02-05 13:21:00
【问题描述】:

当我尝试使用 Entity Framework 向我的学生添加书籍时,它会抛出异常“违反多重性约束。关系‘LibarySystem.DataModel.Student_LendedBooks’的角色‘Student_LendedBooks_Source’的多重性为 1 或 0..1”。我该如何解决?我对实体框架不是很熟悉。感谢您的帮助。

DbContext 类:

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

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

}

学生班级:

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; }

}

书籍类:

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();
        }
    }

【问题讨论】:

  • 您是否尝试将相同的Book 添加到多个Student

标签: c# .net entity-framework


【解决方案1】:

如果您想将Book 添加到一个Student

那我相信你有一个错字:

findStudent?.LendedBooks.Add(book);

应该变成:

findStudent?.LendedBooks.Add(findBook );

【讨论】:

    【解决方案2】:

    此代码存在多个设计问题。但是对于初学者来说,“借出的书”必须是一个单独的实体,它将 (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();
            }
        }
    }
    

    【讨论】:

    • 如果一个Book一次只能借给一个Student,这是不正确的。
    • 极不可能的情况
    • 我想一次只把书借给一个学生,但是一个学生可以借多本书。
    【解决方案3】:

    您正确设置了findBook.Student 属性,但随后将方法参数book 添加到findStudent.LendedBooks。如果那本书有另一个 Student 设置为它的属性,那么您将度过一段糟糕的时光。

    findStudent?.LendedBooks.Add( findBook ) 调用移到findBook != null 块内,并按照书面说明将book 替换为findBook

    【讨论】:

      猜你喜欢
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多