2013-06-28 4 views
5

これらは私の実体である:操作に失敗しました:関係は変更できませんでした外部キ​​ー特性の1つ以上が非NULL可能であるため、

public class Currency : Exchange 
{ 
    public List<CurrencyPrice> CurrencyPrice { get; set; } 
} 

public class CurrencyPrice : Price 
{ 
    public int CurrencyId { get; set; } 
    [ForeignKey("CurrencyId")] 
    public Currency Currency { get; set; } 
} 

私はDBのすべてに値を挿入初めてOKですが、私は、DB内の任意の値を変更して、レコードを挿入または更新しようとする場合、私はこのエラーを取得する:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

は、これは私の挿入コードです:

var currency = 
    UnitOfWork.Exchange.Get(x => x is Currency && x.ExchangeType.Id == exchangeTypeId) as Currency; 
if (currency != null) 
{ 
    CurrencyPrice lastPriceValue = UnitOfWork.CurrencyPrice.Last(x => x.CurrencyId == currency.Id); 
    if (lastPriceValue == null || lastPriceValue.Value != price) 
    { 
     currency.CurrencyPrice = new List<CurrencyPrice> 
      { 
       new CurrencyPrice {Id = Guid.NewGuid().ToString(), EntryDate = DateTime.Now, Value = price,CurrencyId = currency.Id,Currency = currency} 
      }; 
    } 
    else 
    { 
     lastPriceValue.EntryDate = DateTime.Now; 
    } 

    UnitOfWork.Commit(); 
} 

StackOverflowを検索したところ、thisが見つかりました。しかし、私は自分がしなければならないことを理解していません。

答えて

10

は、私はこの問題は、このコードブロックにあると思う:

ここ
currency.CurrencyPrice = new List<CurrencyPrice> 
{ 
    new CurrencyPrice {Id = Guid.NewGuid().ToString(), EntryDate = DateTime.Now, Value = price,CurrencyId = currency.Id,Currency = currency} 
}; 

新しいCurrencyPriceを作成し、それによって前にこのCurrencyに割り当てられたCurrencyPriceオブジェクトを孤立、Currencyに割り当てます。このオブジェクトはデータベースにまだ残っていますが、親はありません。したがって、EntityFrameworkは、このCurrencyPriceの親のIDをNULLに設定して、データベースが引用したエラーを防止するようにしたいとします。私はこの問題の詳細な説明をthis answerに掲載しました。

これを防ぐには、新しいものを追加する前に、データベースから古いCurrencyPriceを削除します。あるいは、CurrencyPriceオブジェクトは常にCurrencyの親に依存しているように見えるので、これを識別関係にすることを検討することもできます。 EntityFramework 4 Model Firstを使用してそれらを作成する方法を説明しました(Implementing identifying relationships with EF4)。私はコードファーストではまだ作業していませんが、アプローチは似ているはずです。

+0

とてもいい説明。ありがとうございました。 –

0

コンテキストに変更を保存するときに同じエラーが発生し、エンティティまたはリレーションシップに変更が加えられていませんでした。

エラーは、いくつかのエンティティにGetHashCode()メソッドovveriddenがあったためです。

関連する問題