EF代码中这种多对多关系有什么问题?

时间:2012-11-11 10:06:07

标签: entity-framework foreign-keys code-first relationship

我的数据库中有这些架构:

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

1 个答案:

答案 0 :(得分:0)

我删除了

sv2.Add(t2);

并且有效