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なしでアタッチするが、ハードコードされたマジックストリングがあり、エンティティセット名をまったく変更すると壊れ、コンパイル時のチェックが行われない...コンパイル時のチェックを続けるアタッチする方法はありますか?
ハードコードされた文字列がコンパイル時の検証を無効にするので、これができるといいのですが=)
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を模倣する方法
ご覧のとおり、どちらも非常に使いやすく、文字列を完全に避けています。
お役に立てれば
アレックス
EntitySet名で文字列を書きたくない場合は、これを試してください
entities.AttachTo(entities.CreateObjectSet<T>().EntitySet.Name, entity);
これに代わる方法は、特に、操作するエンティティがわからない場合は次のようになります。
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);
フォローしてみてください
entities.AddToAuthors(dbAuthor);