2017-01-24 6 views
0

私はEntity Framework Code-Firstと汎用リポジトリパターンを使用してデータベースに最初のデータセットを挿入しようとしています。私のPOCOクラスは、これらの関係を持っている:最初のリポジトリ・パターンを使用してコード・ファーストにEFにデータの最初のセットを挿入します。

  • 学生はレッスン
  • 学生がここでコラージュ

と1対多の関係を持っているとの多対多の関係を持っている私の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(); 
} 

私はこのエラーを取得:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.Students_dbo.TblCollage_CollageId". The conflict occurred in database "test2", table "dbo.TblCollage", column 'Id'. The statement has been terminated.

は、私は私がテーブル間の関係を持っていますが、関係があるときにどのように私は、データの最初のセットを挿入することができることを知っています?私はデータを渡した後で私の関係を含めるべきですか?

答えて

1

how can i insert the first set of data when there is a relation?

CollageIdは、設定が必要であることを意味します。現在、お客様のモデルでは、StudentにはCollegeが1つ必要ですので、SQL Serverでは無効な行を挿入することはできません。

Studentを追加するには、最初にCollegeを追加する必要があります。

​​

EFはかなりスマートなので、どちらの方法でも使えるはずです。

Studentを作成中にCollegeを作成します。

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

既存のCollageIdをStudentオブジェクトに追加するか、必要に応じて新しいCollageオブジェクトを作成してStudentオブジェクトのCollageプロパティとして設定する必要があります。

このエラーの原因は、CollageIdを設定せずに生徒を追加することはできませんが、Collageなしで生徒を保存しようとするデータベース制約です(CollageId = 0)。

関連する問題