C# 在使用实体框架、使用多个条件播种数据时,如何获得PK

C# 在使用实体框架、使用多个条件播种数据时,如何获得PK,c#,asp.net-mvc,entity-framework-6.1,C#,Asp.net Mvc,Entity Framework 6.1,结合MVC-5和Identity-Framework-2使用Entity-Framework-6。我想从第一个种子中找到主键,并将找到的键插入第二个种子中。我使用多种条件来查找密钥,但不知何故,我的Lambda expression不起作用或写得不正确 我错过了什么 从这里开始:/migrations/configurations.cs 我正在使用这个例子作为我剩余的种子的基础 protected override void Seed(ApplicationDbContext context)

结合MVC-5和Identity-Framework-2使用Entity-Framework-6。我想从第一个种子中找到主键,并将找到的键插入第二个种子中。我使用多种条件来查找密钥,但不知何故,我的Lambda expression不起作用或写得不正确

我错过了什么

从这里开始:/migrations/configurations.cs

我正在使用这个例子作为我剩余的种子的基础

protected override void Seed(ApplicationDbContext context)
{
    bool itWorks = WriteReferenceData(context);
    base.Seed(context);
}

private bool WriteReferenceData(ApplicationDbContext ctx)
{
    DbContextTransaction transaction = null;
    bool succeeded = false;
    try
    {
        transaction = ctx.Database.BeginTransaction();

        CreateDetails(ctx);
        CreateRooms(ctx);

        ctx.SaveChanges();
        transaction.Commit();
        succeeded = true;
     }
     catch (Exception ex)
     {
         if (transaction != null) { transaction.Rollback(); transaction.Dispose(); }
         succeeded = false;
     }
     return succeeded;
}
在第一个seed中,我将插入多个记录,PK是DB生成的。当我运行此方法时,记录被正确插入并生成PK

// FIRST SEED
private void CreateDetails(ApplicationDbContext ctx)
{
  var Details = new List<Detail>
  {
      new Detail { MaxUsers = 1, RoomName = "WorkRoom"},
      new Detail { MaxUsers = 2, RoomName = "WorkRoom"},
      new Detail { MaxUsers = 3, RoomName = "PlayRoom"}
  };
  Details.ForEach(s => ctx.Detail.AddOrUpdate(p => p.DetailID, s));
  ctx.SaveChanges();
}

// SECOND SEED
private void CreateRooms(ApplicationDbContext ctx)
{
    // THIS IS NOT WORKING CORRECTLY
    Int16 ID = ctx.Detail
                  .Single(x => 
                      x.RoomName == "WorkRoom" &&   
                      x.MaxUsers == 2).DetailID;

    var Rooms = new List<Room>
    {
        // 1 person
        new Room { RoomID = "X-16", DetailID = ID}
        new Room { RoomID = "X-17", DetailID = ID}
    };
    Rooms.ForEach(s => ctx.Room.AddOrUpdate(p => p.RoomID, s));
    ctx.SaveChanges();
}

在读了很多关于林克和兰姆达的书后,答案比我想的要简单得多

var detail = ctx.Detail.Where(x => x.DetailRoomName == "Patientroom" && x.MaxUsers == 1);

int detailID = detail.Single().DetailID;

var Rooms = new List<Room>
{
    // 1 person
    new Room { RoomID = "X-16", DetailID = detailID }
    new Room { RoomID = "X-17", DetailID = detailID }
};

如果您将子项添加到父项的子项的导航属性集合中,EF将为您修复外键值。房间和详细信息之间的关系是什么?为什么Room和RoomName Detail中有DetailID属性?@keith:Room和Detail有多对一的关系。我有很多房间,他们有一个细节。如您所见,DetailKey是Rooms表中的一个FK。EF不会自动修复外键,因为这些外键受特定条件的约束。我知道,RoomName不是房间的属性,而是Detail.ctx.Detail.AddOrUpdatep=>p.DetailID,s看起来可疑。在示例中,他们使用自然键查找可能被更新的行,而不是代理键。您能确认在第一次保存更改后,表中有三行吗?