web-dev-qa-db-ja.com

データベースからではないEntityFrameworkオブジェクトをアタッチするにはどうすればよいですか?

Entity FrameworkオブジェクトとPOCOオブジェクトが完全に分離されているので、それらを前後に変換するだけです...

つまり:

// poco
public class Author
{
   public Guid Id { get; set; }
   public string UserName { get; set; }
}

次に、同じプロパティを持つEFオブジェクト「Authors」があります。

だから私は私のビジネスオブジェクトを持っています

var author = new Author { UserName="foo", Id="Guid thats in the db" };

このオブジェクトを保存したいので、次のようにします。

var dbAuthor = new dbAuthor { Id=author.Id, UserName=author.UserName };
entities.Attach(dbAuthor);
entities.SaveChanges();

しかし、これは私に次のエラーを与えます:

EntityKey値がnullのオブジェクトは、オブジェクトコンテキストにアタッチできません。

EDIT: entity.AttachTo( "Authors"、dbAuthor);を使用する必要があるようです。 EntityKeyなしでアタッチするが、ハードコードされたマジックストリングがあり、エンティティセット名をまったく変更すると壊れ、コンパイル時のチェックが行われない...コンパイル時のチェックを続けるアタッチする方法はありますか?

ハードコードされた文字列がコンパイル時の検証を無効にするので、これができるといいのですが=)

22
sontek

AttachTo を使用して、エンティティセットを指定してみましたか?..

entities.AttachTo("Authors", dbAuthor);

どこ "Authors"は実際のエンティティセット名になります。

編集:
はい、もっと良い方法があります(そうあるべきです)。デザイナは、ObjectContextに "Add"メソッド を生成する必要があります。これは、上記の呼び出しに変換されます。したがって、次のことができるはずです。

entities.AddToAuthors(dbAuthor);

文字通り次のようになります。

public void AddToAuthors(Authors authors)
{
    base.AddObject("Authors", authors);
}

whateverobjectcontext.designer.csファイルで定義されています。

13

今これを見ているだけです。 ObjectContextにAttach()を使用する場合、つまり、エンティティがデータベースにすでに存在することをエンティティフレームワークに納得させ、マジックストリングの使用を避けたい場合。

ctx.AttachTo("EntitySet", entity);

拡張方法に基づいて2つの可能性を試すことができます。どちらも、間違いなく人生をより耐えられるものにします。

最初のオプションでは、次のように書くことができます。

ctx.AttachToDefault(entity);

ここで説明します: ヒント13-エンティティを簡単な方法でアタッチする方法

2番目のオプションでは、次のように記述できます。

ctx.EntitySet.Attach(entity);

ここで説明します: ヒント16-今日の.NET 4.0のObjectSetを模倣する方法

ご覧のとおり、どちらも非常に使いやすく、文字列を完全に避けています。

お役に立てれば

アレックス

15
Alex James

EntitySet名で文字列を書きたくない場合は、これを試してください

entities.AttachTo(entities.CreateObjectSet<T>().EntitySet.Name, entity);
5
sebagomez

これに代わる方法は、特に、操作するエンティティがわからない場合は次のようになります。

string className = entityObject.GetType().Name;
var container = _DbContext.MetadataWorkspace.GetEntityContainer(_DbContext.DefaultContainerName, DataSpace.CSpace);
string setName = (from meta in container.BaseEntitySets
                  where meta.ElementType.Name == className
                  select meta.Name).First();
_DbContext.AttachTo(setName, entityObject);
4

フォローしてみてください

entities.AddToAuthors(dbAuthor);
0
Roman O