2016-11-14 65 views
0

我想使用EF做一個數據加載並卡住當兒童記錄存在時無法插入新記錄的地方。這是一個例子。實體框架:用新的父對象更新現有的子對象

public class Position 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long Id { get; set; } 
    public string PositionName { get; set; } 
} 

public class Application 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long Id { get; set; } 
    public string ApplicationName { get; set; } 
    public Position ApplicationPosotion { get; set; } 
} 

在上述例子中的多個應用程序可以屬於一個位置。假設我們已經有職位記錄,並且如果我撥打以下電話,它將失敗,因爲ID爲5的位置已經在數據庫中。

public static void UseEntityFrameWorkOneFail() 
    { 
     using (var db = new DemoDbContext(@"Server=DESKTOP-HUJVOQ5\SQLEXPRESS;Database=Demo2;Trusted_Connection=True;")) 
     { 
      Application appOne = new Application 
      { 
       Id = 7, 
       ApplicationName = "AppOne", 
       ApplicationPosotion = new Position { Id = 5, PositionName = "ABC" } 
      }; 

      db.Applications.Add(appOne); 
      db.SaveChanges(); 

      appOne = db.Applications.Find(7); 
      Console.WriteLine(appOne.ApplicationPosotion.PositionName); 
     } 
    } 

現在我可以拉這個紀錄,讓這樣的電話,得到它的工作

 public static void UseEntityFrameWorkPass() 
    { 
     using (var db = new DemoDbContext(@"Server=DESKTOP-HUJVOQ5\SQLEXPRESS;Database=Demo2;Trusted_Connection=True;")) 
     { 
      Application appOne = new Application 
      { 
       Id = 8, 
       ApplicationName = "AppOne", 
       ApplicationPosotion = db.Positions.Find(5) 
      }; 

      db.Applications.Add(appOne); 
      db.SaveChanges(); 

      appOne = db.Applications.Find(8); 
      Console.WriteLine(appOne.ApplicationPosotion.PositionName); 
     } 
    } 

但是我想知道如果有一個簡單的方法來做到這一點。我將JSON轉換爲對象並保存用於數據加載目的。

我只想要的是如果子記錄存在(在這種情況下位置),那麼只需使用新值更新它。 一個的Upsert

  Application appOne = new Application 
      { 
       Id = 7, 
       ApplicationName = "AppOne", 
       ApplicationPosotion = new Position { Id = 5, PositionName = "123" } 
      }; 

      db.Applications.AddOrUpdate(appOne); 
      db.SaveChanges(); 

在那裏我使用AddOrUpdate會做的Upsert父對象,但不是孩子的對象上面的例子。我希望子對象也被更新。

感謝

回答

1
var appPosotion = db.Positions.Any(o => o.Id== 5)) ?? new Position { Id = 5, PositionName = "ABC" } 

Application appOne = new Application 
{ 
    Id = 8, 
    ApplicationName = "AppOne", 
    ApplicationPosotion = appPosotion 
}; 
+0

以上仍然強迫我做檢查。我正在尋找一種方法來覆蓋子對象具有的任何值。更喜歡Upsert –

+0

是不是'db.Positions.FirstOrDefault(o => o.Id == 5))??''而不是'.Any('? – Developer

0

這是你在找什麼?更新ApplicationPosotion而不擊中給定ID(這裏是5)的Position的數據庫?

var position = new Position { Id = 5}; 
db.Positions.Attach(position); 

      Application appOne = new Application 
      { 
       Id = 8, 
       ApplicationName = "AppOne", 
       ApplicationPosotion = position 
      }; 

      db.Applications.Add(appOne); 
      db.SaveChanges(); 
0

上述工作。這是我修改後的代碼。

   Application appOne = new Application 
      { 
       Id = 7, 
       ApplicationName = "AppOne", 
       ApplicationPosotion = new Position { Id = 5, PositionName = "123" } 
      }; 

      db.Positions.AddOrUpdate(appOne.ApplicationPosotion); 
      db.Applications.AddOrUpdate(appOne); 
      db.SaveChanges(); 

      appOne = db.Applications.Find(7); 
      Console.WriteLine(appOne.ApplicationPosotion.PositionName); 

他們在EF中的簡單設置是什麼,它告訴我們只要做一個Upsert?現在我必須將每個對象都分解。

+0

你沒有看到我的答案。我已經提出了: ) – CodeNotFound

+0

你的回答是正確的。我期待看看我們是否有我們可以設置的選項,這樣我就不必破壞每一個複雜的對象。我正在嘗試執行一個ETL,讓我獲取需要加載到SQL Server中的不同類型的對象 –

0

這裏是3級深

   Application appOne = new Application 
      { 
       Id = 7, 
       ApplicationName = "AppOne", 
       ApplicationPosition = new Position 
       { 
        Id = 5, 
        PositionName = "123", 
        SalaryAmount = new Salary() { Id = 1, SalaryAmount = 200000 } 
       } 
      }; 

      db.Salarys.AddOrUpdate(appOne.ApplicationPosition.SalaryAmount); 
      db.Positions.AddOrUpdate(appOne.ApplicationPosition); 
      db.Applications.AddOrUpdate(appOne); 
      db.SaveChanges(); 

      appOne = db.Applications.Find(7); 
      Console.WriteLine(appOne.ApplicationPosition.SalaryAmount.SalaryAmount); 

一個例子,但我喜歡跳過這一步

  db.Salarys.AddOrUpdate(appOne.ApplicationPosition.SalaryAmount); 
      db.Positions.AddOrUpdate(appOne.ApplicationPosition); 

因爲我不想設置此爲每個對象。