簡體   English   中英

多對多鏈接表實體框架的插入

[英]Many to many link table entity framework insertion

我有以下關系: 表關系

和以下類(僅相關屬性):

  1. 事務:(AffairID,標題,...,事務組)
  2. 組:(GroupID,名稱,...,事務組)
  3. 事務組(AffairID,GroupID,事務,組)

我想將新的事務記錄添加到數據庫中,該記錄也將添加到“事務組”表中(具有已知的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

您的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;}
}

實體框架將使用表名稱“事務”和“組”,如果您真的想將它們命名為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM