2013-01-04 56 views
16

有效的排序這是我的模型無法確定相關的操作

public string Content { get; set; } 

public Faq Reply { set; get; } 

public int? ReplyId { get; set; } 

public ICollection<Faq> Children { get; set; } 

[ForeignKey("WriterId")] 
public virtual UserProfile Writer { get; set; } 

public virtual int? WriterId { get; set; } 

public Status Status { get; set; } 

[ForeignKey("DepartmentId")] 
public virtual Department Department { get; set; } 

public virtual int? DepartmentId { get; set; } 

這是我的錯誤

無法確定相關的操作有效的排序。由於外鍵約束,模型要求或商店生成的值,可能會存在依存關係。

+0

我有這個問題 - 這個問題是在INSERT SP的映射是不正確的。 – Ruskin

+0

這是什麼課,一個'Faq'? – Shimmy

+0

如果上述解決方案沒有幫助,並且您有多個導航,請參閱http://stackoverflow.com/questions/21110614/more-than-one-navigation-to-the-same-entity/21857936 – Stefan

回答

1

避免此錯誤的簡單方法是首先創建主要對象SaveChanges,然後在再次調用SaveChanges之前創建依賴對象。

在這種情況下創建您展示上面的第一對象,調用SaveChanges,然後創建的FAQ子對象,將其添加到集合並再次調用SaveChanges設置爲要答覆,然後。

+23

在這種情況下,他失去了單個'SaveChanges()'調用的事務方面。 – Askolein

9

另一個可能的原因是如果外鍵屬性設置不正確。

例如,這可以在以下情況下發生:

  1. DepartmentID的設置爲零或任何其他值不是一個有效的外鍵。
  2. Department可以爲null,也可以是包含其自己的DepartmentId屬性的空值的Department對象。
  3. 此配置將導致實體框架失敗,因爲它試圖找到主鍵爲零的部門,這可能不會存在。

當我將一個對象映射到另一個對象時,我遇到了這個異常,我錯誤地將外鍵設置爲零而不是將其設置爲null。

我不能說這樣的配置是什麼原因導致你的異常沒有看到物業的實際價值,但它是一種可能性。

+0

謝謝。這對我有幫助,因爲這是我的情況! –

3

FWIW,我只花了一個早上在EF 6.1調試類似的問題。就我而言,這是由於意外地混合了不同上下文所擁有的對象:在由一個上下文擁有的對象中設置導航屬性的值,而對象擁有不同的上下文。

0

所以我就遇到了這個問題,我想分享我解決的方式,它並不像調用保存更改兩倍簡單,但在這種方法有一定的優勢。

我有,我想所有的記錄,無論是成功或失敗,孩子們的部分插入不能接受的情況。如果孩子失敗,我也不想編寫代碼來刪除父項(如果該代碼中存在錯誤,該代碼失敗又會怎樣,等等)。

其次,它可能有一組記錄,我想所有的這些記錄成功或在一個事務中失敗。基本上,我對EF有特別的瞭解(我的EF版本是6.1.3)。此外,我只在父母親的關係中深入一層,而不是任意深度的層數。

int tempId = -1; 
int parentTempId = -1; 
foreach(var record in recordsToSave) 
{ 
    var childRecords = record.ChildRecords.ToList(); 

    record.ChildRecords.Clear(); 

    record.RecId = tempId; 
    parentTempId = tempId; 
    tempId--; 

    _db.Records.Add(record); 

    foreach(var childRecord in childRecords) 
    { 
     childRecord.RecId = tempId; 
     childRecord.ParentRecId = parentTempId; 
     tempId--; 
     _db.Records.Add(childRecord); 
    } 
} 

using (TransactionScope tran = new TransactionScope()) 
{ 
    _db.SaveChanges(); 
    tran.Complete(); 
} 
  • 首先我清除子集合並複製它到一個臨時目錄。 EF在我的關係上遇到了問題。
  • 我創建了一個臨時ID並將其分配給父記錄,並將其存儲以供以後與孩子一起使用。
  • 我手動將孩子連接到父母 - 通過我的臨時ID。

它的工作,它也插入我的數據,在視覺上吸引人的方式(至少對我來說)enter image description here

0

這發生在我身上。 EF 6.1/MVC

IN:公衆的ActionResult創建(OfficeRecordModel officeData)

我們:

Office newOffice = new Office(); 
newOffice.Parent = officeData.Parent; 
newOffice.Level = officeData.Level != null ? officeData.Level.Value : -1; 
newOffice.ShortName = officeData.ShortName.Trim(); 
newOffice.LongName = officeData.LongName.Trim(); 
newOffice.IsActive = officeData.IsActive;       
dbCtxt.Office.Add(newOffice); 
dbCtxt.SaveChanges(); 

轟我得到: {「無法確定相關操作的有效順序依賴可能存在因外鍵約束,模型要求,或存儲生成的值「}

辦公室實體:

public int ID { get; set; } 
public Nullable<int> Parent { get; set; } 
public int Level { get; set; } 
public string ShortName { get; set; } 
public string LongName { get; set; } 
public bool IsActive { get; set; } 

Office表具有我們未設置的身份標識。所以EF使用0.那麼,我們在Office表中有一個ID = 0的記錄(在這個遞歸的自我引用表中,我們的root辦公室)。

要解決這個問題,我們將Identity ID設置爲-1。因此,現有密鑰不會再有衝突。 -1最終被忽略,身份被設置。

添加:newOffice.ID = -1;訣竅。

0

我創建了一個sample project,它可以在你有兩個關係時模擬錯誤。基本上這個想法是,你有一個客戶的訂單清單。然後在客戶上你想存儲一個額外的屬性來標記當前的訂單。這導致實體框架在一個事務中存儲和刪除時存在問題的「兩個」關係。

最好在訂單上創建一個布爾標誌「IsCurrent」並對其進行過濾。還可以在客戶上創建一個自動進行過濾的屬性或擴展。這已在this後解釋。

我認爲除了使用兩次調用SaveChanges的方法之外,沒有別的方法,因爲這樣做會讓UnitOfWork的想法失效。

0

在我來說,它是由嵌套一個新的依賴對象內的另一個新的對象過程中創建這樣的原因造成的:

var mySecondaryObject = new MyClass1 { ... }; 
var myPrimaryObject = new MyClass2 { Child = mySecondaryObject, ... }; 
dbContext.MyClass2Collection.Add(mySecondNewOject); 
dbContext.SaveChanges(); 

刪除嵌套參考,主要目的是創建後解決了分配的孩子問題。

0

可能晚了,但我有同樣的問題,並解決了這個問題。如果有父項,則將該子項添加到父項子項屬性,如果不是隻保存對象。

  using (var context = new MyEntities()) 
      { 
       child.CreatedOn = DateTime.Now; 

       if (child.ParentId == null) 
       { 
        context.Things.Add(child); 
       } 
       else 
       { 
        var parent = context.Things.Where(x => x.Id == child.ParentId).SingleOrDefault(); 

        if(parent == null) 
        { 
         return false; 
        } 

        parent.Things.Add(child); 
       } 

       context.SaveChanges(); 

       return true; 
      } 
0

這是我們如何解決這個問題。我們有定義了sql查詢的實體來填充實體。該實體有一列標記爲關鍵字,並具有插入,更新和刪除CRUD方法。 Key列自動填充Oracle存儲過程並返回到遊標中。插入新行時出現此錯誤。

研究和調查後,我們發現這個問題是由於要插入存儲過程傳遞鍵列作爲參數值,當存儲過程返回鍵列自動生成的價值也被填充。

我們移除了插入SP鍵列參數和問題得到解決。