と呼ばれるエンティティがCost
あります。これには、次の必須プロパティがあります。CostType
このCost
クラスにはGetNew()
、Costのすべてのデフォルトを設定するメソッドがあります。
public static GetNew()
{
Cost cost = new Cost ();
foo.CostType = Lists.CostTypes.FirstOrDefault();
// Other Default Values
return foo;
}
これLists.CostTypes
は、起動時にEFから取得され、ComboBoxesで使用される静的リストです。
最初にメソッドでCostTypeを設定した後、コード内でCostTypeを設定する際に問題が発生しますGetNew()
。
たとえば、次のコードはExcelファイルを読み取り、Excelファイルの列に基づいてデフォルトのタイプを設定します。一致するものが見つからない場合はnullを設定します。
Cost cost = Cost.GetNew();
cost.CostType = Lists.CostTypes.FirstOrDefault(t => t.Name == row[0].ToString());
私の問題は、保存操作中に次のエラーが発生することです。
操作が失敗しました:1つ以上の外部キープロパティがnull許容でないため、関係を変更できませんでした。リレーションシップに変更が加えられると、関連する外部キープロパティがnull値に設定されます。外部キーがnull値をサポートしていない場合は、新しい関係を定義するか、外部キープロパティに別の非null値を割り当てるか、関連のないオブジェクトを削除する必要があります。
私の追加操作は次のようになります。
public static void AddObject(EntityObject obj, string entitySetName)
{
context.AddObject(entitySetName, obj);
context.SaveChanges();
}
- Excelファイルを読み取るときにコストを手動で設定するコード行を削除すると、保存は正常に機能します。
- Lists.Costs [2]を読み取るようにコード行を変更すると、問題なく保存されます。
- デフォルトを設定しているコード行を削除すると
GetNew()
、CostTypesのPKルールに違反しているというエラーが表示されます。これは、CostTypeを挿入しようとしていることを意味します。 - Typeを表示しているComboBoxを別のものに変更しても、同じエラーが発生します。
- Excelファイルからコストを読み込んだ後、タイプを変更して保存しようとすると、通常の追加/編集フォームで同じエラーがスローされます。Excelファイルを読み込まない場合は、正常に機能します。
私はまだEntityFrameworkを学んでいますが、これまでのところ、使用するのはフラストレーションと頭痛の種に過ぎません。誰かが私の問題が何であるか、そして私がそれをどのように修正できるか知っていますか?
編集
これがSlaumaから要求された情報です。私はそれをシンプルに保ち、無関係なオブジェクトを除外しています
Costs
あるテーブルにありCostTypes
、別のテーブルにあります。データベースでは、Costs.TypeId
列をnullにすることはできず、への外部キーCostTypes
です。両方のテーブルのId
フィールドは自動生成されます。私のEFモデルは、2つのデータベーステーブルが追加された一般的なモデルです。私が行った唯一の変更は、一部のフィールドの名前を変更し、
CostTypes.Costs
Navigationプロパティを削除することでした。インポートされるExcelファイルは、ほとんどのコストを一致するものにマップしますが
CostType.Name
、Excelファイルの文字列がに一致しない可能性があるCostType
ため、Lists.CostTypes.FirstOrDefault(t => t.Name == row[0].ToString()) can assign a
NULLvalue to the
Cost.Typeproperty. That doesn't seem to be a problem though, because the form still comes up with the list of costs and their default selected items. Item's with a
NULLCostType do not have an item selected in the CostType
ComboBox`を実行し、保存する前に修正する必要がある検証エラーをトリガーします。
CostType
リストをロードするコードは次のとおりです。
public static List<T> GetList<T>(string sortProperty)
where T : EntityObject
{
using (var context = new TContext())
{
return ApplyOrder<T>(context.CreateObjectSet<T>(), sortProperty, "OrderBy").ToList();
}
}
ApplyOrder
コードはここにあります。
GetListメソッドはから呼び出されます
public static class Lists
{
public static List<CostType> CostTypes { get; private set; }
static Lists()
{
CostTypes = DAL<CostEntities>.GetList<CostType>("Name");
}
}