实体框架:使用新的父对象更新现有子对象

时间:2016-11-14 00:59:15

标签: c# entity-framework

我正在尝试使用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,但不对子对象执行Upsert。我希望更新子对象。

由于

4 个答案:

答案 0 :(得分: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  
};

答案 1 :(得分:0)

这是你在找什么?更新ApplicationPosotion而无需访问给定ID的Position数据库(此处为5)?

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();

答案 2 :(得分: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?现在我必须将每个对象分解。

答案 3 :(得分: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);

因为我不想为每个对象设置它。