首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用实体框架,使用多个条件进行数据播种时,如何获取主键

在使用实体框架,使用多个条件进行数据播种时,如何获取主键
EN

Stack Overflow用户
提问于 2014-08-12 15:32:45
回答 1查看 98关注 0票数 0

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

我遗漏了什么?

查看此处: /migrations/configurations.cs

我将使用这个示例https://stackoverflow.com/a/24936095/2910930作为其余seed的基础。

代码语言:javascript
复制
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;
}

在第一个种子,我将插入多个记录,主键是DB生成的。当我运行这个方法时,记录被正确插入并生成PK。

代码语言:javascript
复制
// 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();
}
EN

回答 1

Stack Overflow用户

发布于 2014-09-13 03:23:54

在阅读了大量关于linq和Lambda的内容之后,答案比我想的要简单得多。

代码语言:javascript
复制
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 }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25258601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档