2011-07-15 18 views
0

私は同じ問題を抱えています。新しいオブジェクトを挿入しようとすると、EFはいくつかのプロパティに対してnull値を挿入し、挿入が失敗します。Entity Framework - 新しいオブジェクトを作成するときにnull値を挿入しようとしています

まず、DBの構造について説明します。そのイベント管理システムでは、各イベントを練習グループに関連付ける必要があり、キャッシュテーブルに格納されますが最終的にActive Directoryからフェッチされます。私は手動で結合テーブルを作成しました - それは問題ですか?とにかく、EventにはEventPracticeGroupを指す外部キーがあります。外部キーはPracticeGroupCacheを指しています。 PracticeGroupCacheには、Regionsテーブルを指すRegionIdもあります。

新しいEventPracticeGroupオブジェクトを挿入しようとすると問題が発生します。以下は、私が現在使用しているコードは次のとおりです。

とにかく
var eventPracticeGroup = new EventPracticeGroup(); 
if (TryUpdateModel<EventPracticeGroup>(eventPracticeGroup)) 
{ 
    /* 
    var eventId = EventScheduleRepository.GetById(Convert.ToInt32(Request.QueryString["EventScheduleId"])).EventId; 
    eventPracticeGroup.Event = EventRepository.GetById(eventId); 
    eventPracticeGroup.PracticeGroupCache = PracticeGroupCacheRepository.GetById(eventPracticeGroup.PracticeGroupCacheId); 
    eventPracticeGroup.PracticeGroupCache.Region = RegionRepository.GetById(eventPracticeGroup.PracticeGroupCache.RegionId); 
    EventPracticeGroupRepository.Add(eventPracticeGroup); 
    */ 

    var eventId = EventScheduleRepository.GetById(Convert.ToInt32(Request.QueryString["EventScheduleId"])).EventId; 
    var theEvent = new Event() { Id = eventId }; 
    EventRepository.Repository.UnitOfWork.Context.AttachTo("Events",theEvent); 
    var practiceGroupCache = new PracticeGroupCache() { Id = eventPracticeGroup.PracticeGroupCacheId }; 
    practiceGroupCache.Region = new Region() { Id = eventPracticeGroup.PracticeGroupCache.RegionId }; 
    eventPracticeGroup.PracticeGroupCache = practiceGroupCache; 
    EventPracticeGroupRepository.Add(eventPracticeGroup); 
    EventPracticeGroupRepository.Save(); 
    return RedirectToAction("Index"); 
} 

...あなたが見ることができるように、私はちょうどスタブオブジェクト(ヘルプなし)を使用して試した、と私はまた、実際にフェッチして設定しようとしましたオブジェクト。私が得るエラーは次のとおりです。

テーブル 'XXXX.dbo.Regions'の 'Name'列に値NULLを挿入できません。列はNULLを許可しません。 INSERTは失敗します。ステートメントは終了されました。

明らかに名前はキーフィールドではありません。私はEDMX XMLをチェックしました.Id(プライマリキー列)のみStoreGeneratedPatternをIdentityに設定しました。これはint32 ID列です。 StoreGeneratedPatternが単一の外部キーでidentityに設定されているわけではありません。

nullを許可するようにRegions.Nameを設定した場合、PracticeGroupCaches.Descriptionは同じエラーをスローします。リンクされたオブジェクトはすべてnullに設定されているようです。私はデバッガで一見を持っていましたが、現在コメントされているコードを使用したとき、何もnullではなく、すべてが値を持っていました。私はRegionRepositoryを持っていて、すべての地域を返すだけで、どこか1つがnullの名前を持っているかどうかを調べることができます。誰もしなかった。私のテストDBには2つしかありません。私たちのオブジェクトコンテキストは、HTTPリクエストごとに共有されます。

誰でも助けてください。この時点で、私はそれが働く限り、最も厄介な回避策を使用して解決します。

よろしく、 ジョナサン。

答えて

-1

すでに問題と解決策を見つけたようです。あなたのDBスキーマでは、列がNULL値を許可していないようです。

EventPracticeGroupRepository.Add(eventPracticeGroup); 

あなたが追加されていますので、どちらかがNULL許可するように、これらすべての列を変更またはnullを挿入していないあなたは、この行を呼び出すとき

+0

私がしました - 解決策はここにあります:http://stackoverflow.com/questions/2550231/mvc-2-entity-framework-view-model-insert。私はnullを挿入しようとしなかった、その点thats。 – user846091

0

は何が起こるかを見て(これはあなたが現在、やろうとしているものです)新しいeventPracticeGroupをコンテキストに追加します。しかし、他の関連するオブジェクトをeventPracticeGroupあります

eventPracticeGroup -> PracticeGroupCache -> Region 

そして、あなたはそれらのための新しいオブジェクトを作成します。

var practiceGroupCache = new PracticeGroupCache() { 
    Id = eventPracticeGroup.PracticeGroupCacheId }; 
practiceGroupCache.Region = new Region() { 
    Id = eventPracticeGroup.PracticeGroupCache.RegionId }; 
eventPracticeGroup.PracticeGroupCache = practiceGroupCache; 

あなたがコンテキストにeventPracticeGroupを追加すると、この全体のオブジェクトグラフは、EFがすべて考慮することを意味している追加されます新しいものとしてDBに追加する必要がある3つのオブジェクト。Idプロパティには他の文字列プロパティ(NameまたはDescriptionなど)のみを入力するので、nullとなります。それらはデータベースでNULL可能ではないため、INSERTコマンドは失敗します。

しかし、関係するエンティティをDBに挿入したくないのは、とにかくeventPracticeGroupだけです。ところでサイドノートとして

var practiceGroupCache = new PracticeGroupCache() { 
    Id = eventPracticeGroup.PracticeGroupCacheId }; 

EventRepository.Repository.UnitOfWork.Context.AttachTo(
    "PracticeGroupCaches",practiceGroupCache); 

practiceGroupCache.Region = new Region() { 
    Id = eventPracticeGroup.PracticeGroupCache.RegionId }; 

EventRepository.Repository.UnitOfWork.Context.AttachTo(
    "Regions",practiceGroupCache.Region); 

eventPracticeGroup.PracticeGroupCache = practiceGroupCache; 

EventPracticeGroupRepository.Add(eventPracticeGroup); 

:だから、あなたは新しいオブジェクトを追加する前に、コンテキストにそれらを添付するようなものが必要このEventRepository.Repository.UnitOfWork.Context.XXXについてここラディスラフMrnkaの答えを見てみましょう:EF 4.0 IsAttachedTo extension method and error An object with the same key already exists

+0

ありがとう、そこにいくつかの興味深いメモ、私はそれらのリンクを読むでしょう。リポジトリからオブジェクトをフェッチしても(つまり、データストアにすでに存在していることをコンテキストが知っている)、同じ理由で失敗しました。上記のように、ナビゲーションプロパティをnullに設定してからEntityKeyを割り当てることが解決されました。助けてくれてありがとう! – user846091

関連する問題