多对多链接表实体框架插入



我有以下关系: 表关系

以及以下类(仅限相关属性(:

事务
  1. :(事务 ID、职务、...、事务组(
  2. 组: (组 ID, 名称, ..., 事务组(
  3. 事务组(事务 ID、组
  4. ID、事务、组(

我想将一个新的事务记录添加到数据库中,该记录也将添加到事务组表(使用已知的组ID(我尝试了以下方法:

private Boolean addAffairToDatabase(Affair affair)
{
AffairDal affairContext = new AffairDal();
affairContext.Affairs.Add(affair);
affairContext.SaveChanges();
AffairsGroupDal affairsGroupContext = new AffairsGroupDal();
affairsGroupContext.AffairsGroups.Add(new AffairsGroup{ AffairID = affair.AffairID , GroupID = user.GroupID});
affairsGroupContext.SaveChanges();
return true;
}

但是我得到以下异常:

SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.AffairsGroups_dbo.Affairs_AffairID". The conflict occurred in database "NuixTest.DAL.AffairsGroupDal", table "dbo.Affairs", column 'AffairID'.

这些是我的上下文类: 1.

public class AffairDal: DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Affair>().ToTable("Affairs");
}
public DbSet<Affair> Affairs { get; set; }
}

阿拉伯数字。

public class AffairsGroupDal: DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<AffairsGroup>().ToTable("AffairsGroups");
}
public DbSet<AffairsGroup> AffairsGroups { get; set; }
}

我做错了什么? 谢谢

如果AffairsGroups位于同一数据库中,则应将它们的 DbSet 放在同一个 DbContext 中。

此外,遵循实体框架代码优先约定是一种很好的做法。这样就不需要添加各种属性或流畅的API

你的AffairsGroups有一个相当直接的多对多关系:一个Group有零个或多个Affairs,每个Affair都可以是零个或多个Groups的成员。

请参阅配置多对多

class Affair
{
public int Id {set; set;}
// an Affair can be member of many Groups:
public virtual ICollection<Group> Groups {get; set;}
... 
}
classs Group
{
public int Id {set; set;}
// a Group can have many Affairs:
public virtual ICollection<Affair> Affairs {get; set;}
... 
}
class MyDbContext : DbContext
{
public DbSet<Affair> Affairs {get; set;}
public DbSet<Group> Groups {get; set;}
}

实体框架将使用表名事务和组,如果您确实想将它们命名为AffairGroup而不终止 s,请考虑为此使用 fluent API。

实体框架会自动检测多对多关系,并将创建第三个表 (AffairsGroups(,如果您不喜欢默认名称,请再次使用流畅 API。

好处是,在正常处理多对多时,您不需要第三张表。选择一个事务并将组添加到其中,或者选择一个组并将事务添加到其中。

using (var myDbContext = ...)
{
// add an affair that is not in a Group yet:
var affair1 = myDbContext.Affairs.Add(new Affair()
{
Groups = new List<Group>(); // not in any group yet
});
// add a Group that has affair1 in it:
var group1 = myDbContext.Groups.Add(new Group()
{
Affairs = new List<Affair>()
{   // only one member: affair1:
affair1,
},
});
MyDbContext.SaveChanges();
// as a test: retrieve affair1 again and see that it suddenly has a Group in it:
var retrievedAffair = myDbContext.Affairs
.Where(affair => affair.Id == affair1.Id)
.Single();
Debug.Assert(retrievedAffair.Groups.Any());
Group groupOfAffair = retrievedAffair.Groups.First();
Debug.Assert(groupOfAffair.Id == group1.Id);
}

因此,在不使用事务组表的情况下,您可以添加带或不带组的事务,或者添加有或没有事务的组。您不需要中间表或使用此表的联接。

// get all Affairs that are in a Group with Name:
IEnumerable<Affair> affairs = myDbContext.Groups
.Where(group => group.Name == Name)
.Select(group => group.Affairs);

最新更新