我有一個實體,稱爲Cost
,其中有CostType
如何在後面的代碼中設置導航屬性的值?
所需屬性的Cost
類有一個GetNew()
方法,將所有成本的默認值:
public static GetNew()
{
Cost cost = new Cost();
foo.CostType = Lists.CostTypes.FirstOrDefault();
// Other Default Values
return foo;
}
的Lists.CostTypes
是被拉到一個靜態列表從EF在啓動和在組合框中使用
我有問題在我的代碼中設置CostType,首先在GetNew()
方法中設置它之後d。
例如,下面的代碼讀取Excel文件,並設置基於Excel文件中的列或null如果它不能找到一個匹配
Cost cost = Cost.GetNew();
cost.CostType = Lists.CostTypes.FirstOrDefault(t => t.Name == row[0].ToString());
我的問題是默認類型,保存操作過程中出現了以下錯誤:
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.
我的添加操作是這樣的:
public static void AddObject(EntityObject obj, string entitySetName)
{
context.AddObject(entitySetName, obj);
context.SaveChanges();
}
- 如果我在讀取excel文件時刪除手動設置Cost的代碼行,則保存工作正常。
- 如果我更改代碼行以讀取Lists.Costs [2],它可以很好地保存。
- 如果我刪除設置了默認值的
GetNew()
中的代碼行,我得到一個錯誤,告訴我違反了CostTypes的PK規則,這意味着它試圖插入成本類型。 - 將顯示類型的組合框更改爲其他內容仍會給出相同的錯誤。
- 在從excel文件加載成本後,當我更改類型並嘗試保存時,我的常規添加/編輯表單會引發相同的錯誤。如果我不加載一個Excel文件,它們工作正常。
我還在學習實體框架,但到目前爲止,它只是一個沮喪和頭痛的使用。有人知道我的問題是什麼以及我如何修復它?
編輯
這是一個被Slauma要求的信息。我保持它的簡單和排除不相關的對象
Costs
是在一個表中,並CostTypes
在另一個表。在數據庫中,Costs.TypeId
列不允許爲空,並且是CostTypes
的外鍵。兩個表的Id
字段都是自動生成的。我的EF模型只是一個通用的,添加了兩個數據庫表。我對它做的唯一更改是重命名某些字段並刪除
CostTypes.Costs
導航屬性。這被大多數進口成本映射到他們的匹配CostType.Name
Excel文件,但它可能是在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
代碼可以發現here。
的的GetList方法是從
public static class Lists
{
public static List<CostType> CostTypes { get; private set; }
static Lists()
{
CostTypes = DAL<CostEntities>.GetList<CostType>("Name");
}
}
'ClassA的class'實際上並不編譯,不是嗎?我希望這不是實際的代碼。 –
'Type'實體是否引用了'ClassA'(一對一關係?)?你並沒有將'class.Type'設置爲'null',所以我猜這個例外並不是抱怨FK是屬於'ClassA.Type'的'null',而是一些其他的FK。 「Lists.Types」中的實體是否附加到上下文中? – Slauma
@Slauma附帶'Lists.Types',如果我註釋掉第二次設置類型的行,則代碼運行正常。它是1:1的關係,我刪除了'Type.ClassA'導航屬性。和@亨克大聲笑否它不是實際的代碼 – Rachel