0

Entity Frameworkを使用してデータベースに追加される行のIDENTITY値を予約することは可能ですか?

の私のオーバーライドではObjectContext.SaveChanges、次のようなことをしたい:

public override int SaveChanges(SaveOptions options)
{
    var affectedEntities = ObjectStateManager.GetObjectStateEntries(
        EntityState.Added |
        EntityState.Modified |
        EntityState.Deleted);

    foreach (var entry in affectedEntities)
    {
        var type = GetObjectType(entry.Entity.GetType());

        if (entry.State == EntityState.Added)
        {
            // log the creation of the new entity into a log file
            // or a different table. For this, I need the newly
            // created entity's ID. Is it possible?
        }
    }

    return base.SaveChanges(options);

    // if I check for ObjectState here, i.e. after SaveChanges, 
    // it won't work? Because once the changes are committed to the database
    // the newly added object's state would no longer remain
    // Added.
}
4

1 に答える 1

1

データベースに ID の事前割り当てを要求することはできません。2 つのオプションがあります

  1. 独自の ID サーバーを実装する
  2. データがデータベースに書き込まれた後に ID を取得する

オプション 2 の例をいくつか示します。どちらも同じことを行います。呼び出しの前に追加されたアイテムのリストを作成し、SaveChanges()後でそれらを反復処理します。

public interface IIDentifiable
{
    int id { get; set; }
}

public override int SaveChanges()
{
    ChangeTracker.DetectChanges();
    List<IIDentifiable> addedObjects = GetNewEntries();
    int result = base.SaveChanges();
    foreach (IIDentifiable o in addedObjects)
    {
        //log o.id
    }
    return result;
}

private List<IIDentifiable> GetNewEntries()
{
    var result = (
        from e in ChangeTracker.Entries()
        where e.State == System.Data.EntityState.Added
        select e.Entity)
        .OfType<IIDentifiable>()
        .ToList();

    return result;
}

の欠点は、などIIDentifiableの他の詳細を取得することです。Type

2番目のオプションは、同じことを行うことですが、dynamic代わりに使用しますIIDentifiable

public override int SaveChanges()
{
    ChangeTracker.DetectChanges();
    List<dynamic> addedObjects = GetNewEntries();
    int result = base.SaveChanges();
    foreach (dynamic o in addedObjects)
    {
        //log o.id
        //log o.GetType()
    }
    return result;
}

private List<dynamic> GetNewEntries()
{
    var result = (
        from e in ChangeTracker.Entries()
        where e.State == System.Data.EntityState.Added
        select e.Entity)
        .ToList();

    return result;
}
于 2013-06-04T12:46:29.867 に答える