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

C# 首先使用存储库模式将第一组数据插入EF代码。,c#,entity-framework,C#,Entity Framework,我试图使用实体框架代码优先和通用存储库模式将第一组数据插入数据库。我的POCO类具有以下关系: 学生与课程有多对多的关系 学生与大学有一对多的关系 以下是我的POCO课程: public class Student : EntityBase { public Student() { this.Lessons = new HashSet<Lesson>(); } public string Name { get; set; }

我试图使用实体框架代码优先和通用存储库模式将第一组数据插入数据库。我的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; }

}
公共类学生:EntityBase
{
公立学生()
{
this.Lessons=newhashset();
}
公共字符串名称{get;set;}
//FK拼贴
public int CollageId{get;set;}
公共虚拟ICollection课程{get;set;}
公共虚拟拼贴{get;set;}
}
公共课:EntityBase
{
公共课()
{
this.Students=newhashset();
}
公共字符串名称{get;set;}
公共虚拟ICollection学生{get;set;}
}
公共类拼贴:EntityBase
{
公共拼贴()
{
学生=新列表();
}
公共字符串名称{get;set;}
公共虚拟ICollection学生{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");
            });

    }
}
公共类StudentMap:EntityTypeConfiguration
{
公共学生地图()
{
//ToTable(“TBL学生”);
HasRequired(x=>x.Collages)
.有很多(e=>e.Students)
.HasForeignKey(i=>i.CollageId)
.WillCascadeOnDelete(假);
有很多(x=>x.Lessons)
.有很多(e=>e.Students)
.Map(i=>
{
i、 MapLeftKey(“StudentFKId”);
i、 MapRightKey(“LessonFKId”);
i、 ToTable(“TblStudent_课程”);
});
}
}
现在在我的控制器中:

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();
}
public ActionResult Index()
{
存储库_reStu=新存储库();
_添加(新学生{Name=“Test”,拼贴ID=0,拼贴=null,课程=null});
_reStu.save();
返回视图();
}
我得到这个错误:

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


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

看起来您应该向学生对象添加一个现有拼贴ID,或者您应该创建一个新的拼贴(如果有必要)对象,并将其设置为学生对象的拼贴属性


该错误的原因是数据库约束不允许添加未设置拼贴ID的学生,但您尝试保存未设置拼贴的学生(拼贴ID=0)。

看起来您应该向学生对象添加现有拼贴ID,或者创建新拼贴(如果有必要)对象,并将其设置为学生对象的拼贴属性

该错误的原因是数据库约束不允许添加未设置拼贴ID的学生,但您尝试保存未设置拼贴的学生(拼贴ID=0)

当存在关系时,如何插入第一组数据

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

因此,为了添加任何
学生
,您需要先添加一所
学院

我是否应该在传递数据后包含我的关系

EF非常聪明,所以您应该能够使用这两种方法中的任何一种

创建
学院
,同时创建
学生

Repository<Student> _reStu = new Repository<Student>();
_reStu.Add(new Student { Name = "Test", Collages = new College { Name = "TestCollege" }, Lessons = null });
_reStu.save();
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();
当存在关系时,如何插入第一组数据

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

因此,为了添加任何
学生
,您需要先添加一所
学院

我是否应该在传递数据后包含我的关系

EF非常聪明,所以您应该能够使用这两种方法中的任何一种

创建
学院
,同时创建
学生

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