簡體   English   中英

實體框架:使用新的父對象更新現有的子對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM