我有个数据库,里面有两个表:Department(部门)和Employee(雇员表)Department的主键为Guid的DepartmentID,和Employee的外键DeparmentID关联,形成一对多关系,用ADO.Net Entity Framework 生成实体后。
我想增加一个雇员:可是生成的Employee实体中没有DepartmentID的属性,我怎么给它赋值呢?
而且也无法更新这个雇员的部门信息,还是因为这个雇员实体中没有DepartmentID的属性!
我找到了一个解决办法是:
Employee emp = new Employee();
emp.Name="xiaozhuang";
ObjectQuery<Department> dept= entities.CreateQuery<Department>("Select Value a from Department as a where a.DepartmentID = @ID", new ObjectParameter("ID", new Guid(DepartmentID)));
dept.FirstOrDefault().Employee.Add(emp);
entities.SaveChanges();
可是这样也太搞笑了吧?插入还要先查询出来啊?性能太差了!
还有一个办法是:
Employee emp = new Employee();
emp.Name="xiaozhuang";
emp.DepartmentReference.EntityKey = new System.Data.EntityKey("ForeseeFrameWorkDataBaseEntities.Department", "DepartmentID", new Guid(departmentid));
entities.AddToEmployee(emp);
entities.SaveChanges();
这样倒是不用查询了,可是这样的话DeparmentID属性的改变绕过了Tracking机制,因为它没有出发PropetyChanged事件,怎么办呢?
同样的道理,更改(Edit/Update)雇员部门的操作也无法完成!
问题补充:如果直接给Employee的导航属性Department赋值DepartmentID的话,实体框架就会试图生成一个新的Department实体,并一起和Employee插入数据库的,但是数据库中已经有个Department了,主键重复出错!
从领域建模的角度说,就是应该先查出来再插入的,这和现有的数据为中心的建模技术有冲突,因此在这些问题上有了矛盾并让习惯了数据中心建模的人感到好笑而已……