我有以下关系: 表关系
以及以下类(仅限相关属性(:
事务- :(事务 ID、职务、...、事务组(
- 组: (组 ID, 名称, ..., 事务组( 事务组(事务 ID、组
- 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; }
}
我做错了什么? 谢谢
如果Affairs
和Groups
位于同一数据库中,则应将它们的 DbSet 放在同一个 DbContext 中。
此外,遵循实体框架代码优先约定是一种很好的做法。这样就不需要添加各种属性或流畅的API
你的Affairs
和Groups
有一个相当直接的多对多关系:一个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;}
}
实体框架将使用表名事务和组,如果您确实想将它们命名为Affair
和Group
而不终止 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);