Entity Framework 6更新表并插入相关外键表

4

对于这个问题,标题不够准确,请编辑。

举个例子,我想要完成的目标是更新表foo中的记录,然后创建一个新的表格,并将其视为外键,考虑一对多的关系。

如何更新具有外键约束的表并在这些后续表中创建新的相关记录?

目前,我正在使用Entity Framework 6将实体添加到上下文中并保存到数据库中。

编辑

为了进一步说明我想要实现的目标,以下对象是一个简化的示例,我试图将其保存到上下文中。如果在已经创建了“Billy Bob”之后尝试添加intObj,因为他买了一辆新车,另外一项服务或他的轮胎已更换,它将创建一个新的Billy Bob记录(重复)和相应的相关表格。

        intObj.FirstName = "Billy";
        intObj.Lastname = "Bob";
        intObj.Important = 100;
        intObj.LastSeen = DateTime.Now.Date;
        intObj.Cars = new List<Car>{
            new Car{
                Model = "Commodore",
                Make = "Holden",
                YearMade = DateTime.Today.Date,
                Odometer = 15000,
                EmailWordCount = 500,
                TyreStatuss = new List<TyreStatus>{
                    new TyreStatus{
                        Tyre1 = "Good",
                        Tyre2 = "Good",
                        Tyre3 = "Okay",
                        Tyre4 = "Okay"
                        }                                 
                },
                Services = new List<Service>{
                    new Service{
                        Cost = "$500",
                        Time = "2 Days",
                        Date = DateTime.Today
                    }
                },
            }
        };

Thanks


你使用哪种方法?先编写代码还是先设计模型/数据库? - E-Bat
我正在使用Code First @E-Bat。 - Corey
我相应地详细阐述了答案。 - E-Bat
1个回答

4
以下代码段展示了一个名为Employee的类,它引用了两个更多的实体:Assignment集合和单个的Country。 像EF、NHibernate等ORM框架有一个名为Transitive Persistence的功能,也就是说,如果一个对象(Assignment和Country)被持久化的对象(Employee)所引用,那么在EF中调用Context的SaveChanges方法时,Assignment和Country将自动变成持久化的对象,而无需显式地保存它们。
    public class Employee
        {
            public virtual Guid Id { get; protected set; }
            public virtual string EmployeeNumber { get; set; }
            public virtual Country BirthCountry { get; set; }
            private ICollection<Assignment> _assignment = new List<Assignment>();
            public virtual ICollection<Assignment> Assignments
            {
                get
                {
                    return _assignment;
                }

                set
                {
                    _assignment= value;
                }
            }
        }

        public class Assignment
        {
            public virtual Guid Id { get; protected set; }
            public virtual DateTime BeginTime { get; set; }
            public virtual DateTime EndTime { get; set; }
            public virtual string Description{ get; set; } 
        }

        public class Country
        {
            public virtual Guid Id { get; protected set; }
            public virtual string Name { get; set; }
        }

   //Somewhere in your program      
   private void SaveAllChanges()
         {
             _db = new EFContext();
             //Creating a new employee here, but it can be one loaded from db
             var emp = new Employee { FirstName = "Emp Name", 
                 LastName = "Emp Last", EmployeeNumber = "XO1500"
             };
             emp.BirthCountry = new Country { Name = "Country1" };
             emp.Assignment.Add(new Assignment{ BeginTime = DateTime.Now,EndTime=DateTime.Now.AddHours(1) });

            //Only employee is explicitly added to the context
            _db.Employees.Add(emp); 
            //All the objects in the employee graph will be saved (inserted in this case) in the db. 
            _db.SaveChanges();
        }
    }

编辑:

这与我上面的代码非常相似,一旦创建了“Billy Bob”,您只需要更新它,包括他购买的任何新服务;

伪代码:

var bob = _db.Clients.SingleOrDefault(c=> c.Id = "Bob Row Id")
//Bob buy a car:
bob.Cars.Add(new Car()...)
//...and change tire 1 from an old car
var car = bob.Cars.SingleOrDefault(c=> c.Id = "Car Row Id")
car.TireStatus.Tire1 = "New"
....

//Persist all changes
//Existing objects will be updated..., and the new ones created in this process will be inserted
_db.SaveChanges()

请让我知道这是否澄清了您的想法。


感谢 @E-Bat 的回复。那正是我最初尝试的方法。我已更新我的问题,包括更多细节,请告诉我是否需要更多澄清。 - Corey
太棒了,谢谢伙计,现在填补了空缺,正常工作! - Corey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接