23

Entity Framework オブジェクトと POCO オブジェクトを完全に分離しています。それらを前後に翻訳するだけです...

すなわち:

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

そして、同じプロパティを持つEFオブジェクト「作成者」があります..

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

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();

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

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

編集: entities.AttachTo("Authors", dbAuthor); を使用する必要があるようです。EntityKeyなしでアタッチするには、しかし、ハードコーディングされたマジックストリングがあり、エンティティセット名をまったく変更すると壊れてしまい、コンパイル時のチェックがありません...コンパイル時のチェックを維持するアタッチできる方法はありますか?

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

4

6 に答える 6

15

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

ctx.AttachTo("EntitySet", entity);

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

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

ctx.AttachToDefault(entity);

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

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

ctx.EntitySet.Attach(entity);

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

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

お役に立てれば

アレックス

于 2009-05-08T06:51:06.803 に答える
13

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

entities.AttachTo("Authors", dbAuthor);

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

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

entities.AddToAuthors(dbAuthor);

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

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

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

于 2009-03-31T06:22:14.603 に答える
5

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

entities.AttachTo(entities.CreateObjectSet<T>().EntitySet.Name, entity);
于 2010-11-16T03:32:16.153 に答える
4

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

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);
于 2012-11-15T03:10:05.240 に答える
0

以下を試していただけますか

entities.AddToAuthors(dbAuthor);
于 2012-08-21T19:57:43.757 に答える
-2

私のため、

Context.Authors.AddObject(new Author())

完璧に動作します。私は何かが足りないのだろうか?それとも正しい方法ではありませんか?

于 2010-10-13T14:36:52.850 に答える