2

データベースに次のスキーマがあります。

Tb1: { Id:int , NameTb1:varchar(50) }
Tb2: { Id:int , NameTb2:varchar(50) }
Tb1Tb2 { Tb1Id:int , Tb2Id:int }

明らかTb1Tb2にリレーションシップ テーブルであり、多対多のリレーションシップを EF コード ファーストで定義したいと考えています。

そして、これらはエンティティクラスです:

public class Tb1 
{
   public Tb1()
   {
       ListTb2 = new List<Tb2>();
   }
   public int Id { get; set; }
   public string NameTb1 { get; set; }

   public virtual ICollection<Tb2> ListTb2 { get; set; }
}

public class Tb2 
{
   public Tb2()
   {
       ListTb1 = new List<Tb1>();
   }
   public int Id { get; set; }
   public string NameTb2 { get; set; }

   public virtual ICollection<Tb1> ListTb1 { get; set; }
}

およびマッピング:

 public class Tb1Map : EntityTypeConfiguration<Tb1>
 {
    public Tb1Map()
    {
        this.HasKey(x => x.Id);

        this.HasMany(x => x.ListTb2)
            .WithMany(xx => xx.ListTb1)
            .Map
            (
                x =>
                    {
                        x.MapLeftKey("Tb1Id");
                        x.MapRightKey("Tb2Id");
                        x.ToTable("Tb1Tb2");
                    }
            );     
    }
}

public class Tb2Map : EntityTypeConfiguration<Tb2>
{
    public Tb2Map()
    {
        this.HasKey(x => x.Id);
    }
}

アプリで使用する場合:

var sv1 = new TableService<Tb1>(_uow);
var sv2 = new TableService<Tb2>(_uow);

var t1 = new Tb1 { NameTb1 = "T111" };
sv1.Add(t1);
//var res1= _uow.SaveChanges();

var t2 = new Tb2 { NameTb2 = "T222" };
sv2.Add(t2);
//var res2 = _uow.SaveChanges();

t1.ListTb2.Add(t2);
var result = _uow.SaveChanges();

次のエラーが表示されます。

リレーションシップの外部キー プロパティを公開しないエンティティの保存中にエラーが発生しました。単一のエンティティを例外のソースとして識別できないため、EntityEntries プロパティは null を返します。保存中の例外の処理は、エンティティ タイプで外部キー プロパティを公開することで簡単に行うことができます。詳細については、InnerException を参照してください。

内部例外は次のとおりです。

INSERT ステートメントが FOREIGN KEY 制約 "FK_Tb1Tb2_Tb2" と競合しました。データベース「dbTest」、テーブル「dbo.Tb2」、列「Id」で競合が発生しました。

なぜこのエラーが発生するのですか? 解決策は何ですか?tnx

4

1 に答える 1

0

削除します

sv2.Add(t2);

そしてそれはうまくいった

于 2012-11-11T11:07:30.250 に答える