1

我有2个问题可以单独回答。

Q#1

我正在尝试保存到数据库服务器的往返行程。

这是我的算法:

  1. 插入 2 个实体(获取数据库生成的 ID)
  2. 使用返回的 ID 调用将 ID 传递给它的存储过程

存储过程获取 ID 并填充我用来存储有向无环图的邻接表。

目前,对于每个父子关系,我都有一个往返于 RDBMS 的往返行程,以及一个用于实体插入的往返行程。

众所周知,我会做这样的事情:

public override int SaveChanges()
{
    foreach (var entry in this.ChangeTracker.Entries().Where(e => e.State == System.Data.EntityState.Added).ToList())
    {
        if (entry.Entity is IRobot)
        {
            entry.Reference("Owner").CurrentValue = skyNet;
        }
    }

    return base.SaveChanges();
}

所以我想知道是否有一种方法可以检测EntityState.Added的“ADD”,其完成类似于以下代码:

var robot = new Robot(); 
skyNet.Robots.Add(robot); 
db.Add(skyNet); 
db.SaveChanges();

这样我就可以做这样的事情:(注意这是伪代码)

public override int SaveChanges()
{
    foreach (var entry in this.ChangeTracker.Entries().Where(e => e.State == EntityState.**AddedToCollection**).ToList())
    {
        db.Relate(parent: skyNet, child: entry.Entity);
    }

    return base.SaveChanges();
}

Q#2

在调用 SaveChanges() 之后,是否有调用存储过程作为数据库“旅行”的一部分?

4

1 回答 1

1

问题 1

您可以通过以下方式检测实体的状态

db.Entry(robot).State

线后

skyNet.Robots.Add(robot);

EntityStaterobotAdded。但是,在您的伪代码中,不清楚skyNet变量的来源。如果您skyNet像在代码片段中一样添加,您可以这样做:

foreach( var skyNet in ChangeTracker.Entries()
                                    .Where(e => e.State == EntityState.Added)
                                    .Select (e => e.Entity)
                                    .OfType<SkyNet>())
{
    foreach(var robot in skyNet.Robots
                             .Where(r => db.Entry(r).State == EntityState.Added))
    {
        db.Relate(parent: skyNet, child: robot);
    }
}

问题2

您不能在一次往返中调用存储过程,这需要 NHibernate 的多查询之类的东西。但是,您可以使用以下方法在一个事务中包装SaveChanges和存储过程调用(我认为这就是您的意思)TransactionScope

using (TransactionScope scope = new TransactionScope())
{
    // stored procedure call here.
    db.SaveChanges();
    scope.Complete();
}
于 2013-05-09T21:38:08.780 回答