使用存储库模式将第一组数据插入EF代码优先。

时间:2017-01-24 10:45:29

标签: c# entity-framework

我正在尝试使用Entity Framework Code-First和通用存储库模式将第一组数据插入数据库。我的POCO课程有这些关系:

  • 学生与课程有多对多的关系
  • 学生与拼贴的一对多关系

以下是我的POCO课程:

public class Student : EntityBase
{
    public Student()
    {
        this.Lessons = new HashSet<Lesson>(); 
    }

    public string Name { get; set; }

    //FK Collage
    public int CollageId { get; set; }

    public virtual ICollection<Lesson> Lessons { get; set; }
    public virtual Collage Collages { get; set; }
}

public class Lesson : EntityBase
{
    public Lesson()
    {
        this.Students = new HashSet<Student>(); 
    }

    public string Name { get; set; }

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

public class Collage : EntityBase
{
    public Collage()
    {
        Students = new List<Student>(); 
    }
    public string Name { get; set; }


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

}

这是我的映射:

public class StudentMap : EntityTypeConfiguration<Student>
{
    public StudentMap()
    {
        //ToTable("TblStudent");

        HasRequired<Collage>(x => x.Collages)
            .WithMany(e => e.Students)
            .HasForeignKey(i => i.CollageId)
            .WillCascadeOnDelete(false);

        HasMany<Lesson>(x => x.Lessons)
            .WithMany(e => e.Students)
            .Map(i =>
            {
                i.MapLeftKey("StudentFKId");
                i.MapRightKey("LessonFKId");
                i.ToTable("TblStudent_Lesson");
            });

    }
}

现在在我的控制器中:

public ActionResult Index()
{
    Repository<Student> _reStu = new Repository<Student>();
    _reStu.Add(new Student { Name = "Test", CollageId = 0, Collages = null, Lessons = null });
    _reStu.save();

    return View();
}

我收到此错误:

  

INSERT语句与FOREIGN KEY约束冲突   “FK_dbo.Students_dbo.TblCollage_CollageId”。冲突发生在   数据库“test2”,表“dbo.TblCollage”,列“Id”。该声明   已被终止。

我知道我有一个表之间的关系但是如何在存在关系时插入第一组数据?在我传递数据后,我应该包括我的关系吗?

2 个答案:

答案 0 :(得分:1)

看起来您应该将现有的CollageId添加到Student对象中,或者您应该创建一个新的Collage(如果它是必要的)对象并将其设置为Student对象的Collage属性。

该错误的原因是数据库约束,它不允许在没有CollageId设置的情况下添加学生,但是您尝试保存没有Collage的学生(CollageId = 0)。

答案 1 :(得分:1)

  

如果存在关系,我如何插入第一组数据?

CollageId是一个不可为空的列,这意味着您需要设置它。目前,您的模型表示每个Student 必须只有一个College,因此SQL Server不允许您插入无效行。

因此,要添加任何Student,您需要先添加College

  

在我传递数据后,我应该包括我的关系吗?

EF非常聪明,所以你应该能够选择其中任何一种方法。

在您创建College时创建Student

Repository<Student> _reStu = new Repository<Student>();
_reStu.Add(new Student { Name = "Test", Collages = new College { Name = "TestCollege" }, Lessons = null });
_reStu.save();

首先创建College,然后创建Student

Repository<College> _reColl = new Repository<College>();
var college = new College
{
    Name = "TestCollege"
};
_reColl.Add(college)
_reColl.save();

// As long as you have the same reference your college will get an Id after you inserted it.

Repository<Student> _reStu = new Repository<Student>();
_reStu.Add(new Student { Name = "Test", CollegeId = college.Id, Lessons = null });
_reStu.save();