2012-02-21 58 views
2

将子实体从一个父实体移动到另一个实体的最佳方式是什么? ObjectContext或DbContext里面有一个方法可以让我们完成这个任务吗?将子实体移动到新的父实体

public class Person 
{ 
    public int PersonId 
    public ICollection<Car> Cars 
} 

public class Car 
{ 
    public int CarId 
    public string Color 
} 

编辑:我目前使用EF 4.0模型第一次与POCO模板。

+0

非常依赖于你如何使用EF(例如代码优先,模式优先等)......你使用POCO,代理等等。如果您使用模板生成的实体或代理,您应该能够更改内存中的关系并保存。 – 2012-02-21 17:23:31

+0

@JamesGaunt:谢谢James,我编辑了我的问题。 – madatanic 2012-02-21 17:25:38

+0

您是否尝试从一个集合中删除并添加到另一个集合中? – usr 2012-02-21 17:51:53

回答

2

我想说你想完成的是在这个例子中改变车的车主

public class Car 
{ 
    ... 
    public virtual Person Owner { get; protected set; } 

    public void ChangeOwner(Person newOwner) 
    { 
      // perform validation and then 
      Owner = newOwner; 
      // maybe perform some further domain-specific logic 
    } 
} 

注意:如果有反对加在Car一个反向引用Person没有严重的缺点我会喜欢的东西去保护二传手是执行调用外部消费者ChangeOwner方法。 EF将能够正确设置它,这要归功于POCO类的自动生成代理(假设您使用它们)。

编辑: 如果不可能添加对Person的反向引用,则从域逻辑角度看,您仍然有相同的目标。你只是想换一辆车的车主。这样的操作包括两个entites的,所以我很可能某处放置实体(无论它应该被放置在一个精心设计的系统)之外的方法去:

public void ChangeCarOwner(Person originalOwner, Person newOwner, int carId) 
{ 
    Car car = originalOwner.RemoveCarOwnership(carId); 
    newOwner.AddCarOwnership(car); 
} 

public class Person 
{ 
    ... 
    public Car RemoveCarOwnership(int carId) 
    { 
     Car car = this.Cars.Single(c => c.Id == carId); 
     this.Cars.Remove(car); 
     return car; 
    } 
} 

这仅仅是一个概念上的一段代码和它肯定可以写的更好(确保老主人实际上拥有汽车等),但我只想提出一个想法,我将如何处理它。我也忽略了AddCarOwnership的实现,因为我认为它非常好。我介绍了这些方法,因为增加和删除所有权可能会在特定人员的“内部”引发更多逻辑。

+0

如果汽车没有导航属性所有者,你会如何处理这个问题? – madatanic 2012-02-23 00:26:32

+0

请查看我的编辑。 – dmusial 2012-02-23 22:28:45

+0

所以基本上,你从一个人中删除“汽车”并将该汽车添加到另一个人。这就是我最终做的。 – madatanic 2012-02-24 22:58:27

相关问题