私は自分の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のオブジェクトは、オブジェクトコンテキストにアタッチできません。
編集:それは私がエンティティを使用する必要があるように見えます。AttachTo( "Authors"、dbAuthor); EntityKeyなしでアタッチするのですが、それからエンティティーセット名をまったく変更してコンパイル時チェックを行わないと壊れるマジックストリングをハードコードしています...コンパイル時チェックを維持するアタッチできる方法はありますか? ?
ハードコードされた文字列がコンパイル時の妥当性検査を中止するので=)を吸うので私は私がこれを行うことができると思います
AttachToを使用してエンティティセットを指定してみましたか。
entities.AttachTo("Authors", dbAuthor);
"Authors"
はあなたの実際のエンティティセット名です。
編集する
はい、もっと良い方法があります(そうあるべきです)。デザイナーはあなたのためにObjectContextに"Add"メソッドを生成しているはずです。それは上記の呼び出しに変換されます。
entities.AddToAuthors(dbAuthor);
これは文字通りであるべきです:
public void AddToAuthors(Authors authors)
{
base.AddObject("Authors", authors);
}
whateverobjectcontext.designer.csファイルで定義されています。
今見ているだけです。もしあなたがObjectContextにAttach()をしたい、すなわちエンティティが既にデータベースに存在していることをエンティティフレームワークに納得させたい、そしてあなたは魔法の文字列の使用を避けたいなら
ctx.AttachTo("EntitySet", entity);
拡張方法に基づいて2つの可能性を試すことができます。どちらも間違いなく人生をより耐えられるものにします。
最初のオプションはあなたが書くことを可能にします:
ctx.AttachToDefault(entity);
そしてここでカバーされています: ヒント13 - エンティティを簡単な方法でつける方法
2番目のオプションはあなたが書くことができます:
ctx.EntitySet.Attach(entity);
ここでカバーされています: ヒント16 - 今日の.NET 4.0のObjectSetを模倣する方法
ご覧のとおり、どちらも本当に使いやすく、文字列を完全に避けています。
お役に立てれば
アレックス