3

皆さん、

マスターを持つ新しいオブジェクトを作成しているときに問題が発生します。問題は、EFがマスターオブジェクトも作成しようとしていることですが、私はそれを必要としません。

私の2つのpocoクラスは次のようになります。

[DataContract(IsReference = true)]
public class Application
{
    [DataMember]
    public int ID { get; set; }

    [DataMemeber]
    public int ProjectManagerId {get; set; }

    [DataMember]
    public ProjectManager PM { get; set;}
}

[DataContract(IsReference = true)]
public class ProjectManager
{
    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string FullName { get; set; }

}

ASP.NET MVCページで新しいオブジェクトを作成しているときに、ApplicationProjectManagerIdが1で、PMフィールドがID = 0で、FullName(たとえば、「フォレストガンプ」)を持つクラスのオブジェクトがあります。

したがって、オブジェクトを追加するとき、application.PM.IDを0にすることはできないという例外があります。

context.Applications.AddObject(application); 
context.SaveChanges();

マスターを追加せずにオブジェクトをaddobjectすることは可能ですか?

回避策を見つけましたが、気に入らないです。コンテキストにオブジェクトを追加する前に、PMフィールドをnullに割り当てています。

application.PM = null;
4

1 に答える 1

4

EFには、知っておく必要のある1つのコアルールがあります。オブジェクトグラフ全体で機能し、同じオブジェクトグラフでデタッチされたエンティティとアタッチされたエンティティを組み合わせることはできません。これは、AttachandAddObjectメソッドの両方が常にオブジェクトグラフ内のすべてのエンティティで実行されることを意味します(ナビゲーションプロパティをトラバースし、操作を再帰的に実行します)。

この重要な動作のため、既存のオブジェクトを手動で処理する必要があります。3つのオプションがあります。

ナビゲーションプロパティは使用しないでください。あなたのApplicationクラスはProjectManagerId公開しました。リレーションを構築するためにナビゲーションプロパティを設定IDせずに、このプロパティを既存の飼い葉桶のに設定するだけで済みます。ProjectManager

var application = new Application { ProjectManagerId = 1 };
context.Applications.AddObject(application);
context.SaveChanges();

親をアタッチし、子を追加し、その後でのみそれらを接続します。

// Create attached existing project manager
var projectManager = new ProjectManager { ID = 1 };
context.ProjectManagers.Attach(projectManager);

// Create a new added application
var application = new Applications();
context.Applications.AddObject(application);

// Now you are making relation between two entities tracked by the context
application.ProjectManager = projectManager;  
context.SaveChanges();

最後のオプションは、単に既存のエンティティの状態を修正することです。この場合、アプリケーションが追加された状態のままである間、プロジェクトマネージャーを変更しないように設定します。

// Add application and its related project manager
context.Applications.AddObject(application);
context.ObjectStateManager.ChangeObjectState(application.ProjectManager, EntityState.Unchanged);
context.SaveChanges();
于 2013-02-08T09:09:04.777 に答える