[英]Entity Framework is creating new child object when parent object is created
[英]Entity Framework : Updating an existing child object with a new parent object
我正在嘗試使用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; }
}
在上面的示例中,多個應用程序可以屬於一個Position 。 假設我們已經有位置記錄,並且如果我進行以下調用,它將失敗,因為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轉換為對象並保存以用於數據加載。
我想要的就是子記錄是否存在(在本例中為Position ),然后使用新值對其進行更新。 熱門
Application appOne = new Application
{
Id = 7,
ApplicationName = "AppOne",
ApplicationPosotion = new Position { Id = 5, PositionName = "123" }
};
db.Applications.AddOrUpdate(appOne);
db.SaveChanges();
上面使用AddOrUpdate的示例將為父對象而不是子對象執行Upsert。 我希望子對象也被更新。
謝謝
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
};
這是你想要的? 是否在不訪問數據庫中給定id(此處為5)的Position
的情況下更新ApplicationPosotion
?
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();
以上作品。 這是我修改的代碼。
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? 現在,我必須分解每個對象。
這是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);
因為我不想為每個對象設置它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.