[英]Many to many link table entity framework insertion
我有以下關系: 表關系
和以下類(僅相關屬性):
我想將新的事務記錄添加到數據庫中,該記錄也將添加到“事務組”表中(具有已知的GroupID),我嘗試通過以下方式進行操作:
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; }
}
2。
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中。
此外,遵循Entity Framework Code First Conventions是一個好習慣。 這樣,就不需要添加各種屬性或Fluent 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
而不使用終止符,請考慮為此使用流暢的API。
實體框架會自動檢測多對多關系,並創建第三個表( AffairsGroups
),如果您不喜歡默認名稱,請再次使用fluent 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);
}
因此,無需使用AffairsGroup表,就可以添加包含或不包含Groups的事務,或包含或不包含事務的Group的事務。 您將不需要中間表或使用該表的聯接。
// get all Affairs that are in a Group with Name:
IEnumerable<Affair> affairs = myDbContext.Groups
.Where(group => group.Name == Name)
.Select(group => group.Affairs);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.