EF与Nhibernate合并断开的对象图

我刚刚在几个星期前开始了一个新项目,并决定尝试使用EF Code First,之前我使用过NHIbernate,我喜欢从MS中获得ORM的想法,到目前为止它一直很棒 – 直到我开始制作复杂的物体。

我的项目层如下:Azure WCF角色 – 使用EF Code First处理DAL。 带有Knockout的MVC 4的Azure WebSite角色 – 处理客户端。 (我为未来创建了WCFRole,我们需要从不同平台访问服务)

这是非常基本的EF Code First设计,我遇到了以下问题: – 我只在服务和站点之间传输DTO,并制作了一个通用映射器来映射内部DTO(如果存在)。 – 我有一个City表和一个带有City Property的地址对象(我们需要City作为特殊function的属性,而不仅仅是名称)

客户端知道城市列表,并且正在返回现有城市的新地址当我尝试添加新地址时,会创建一个新城市,其中包含现有旧城市的数据,我已经知道这是因为EF没有我不知道如何合并断开连接的对象和我阅读的内容不支持任何合并,并且简单的不太舒服的解决方案只是管理对象状态 – 将City对象状态更改为Unchanged。

但是使用大型复杂数据库设计处理这个问题听起来很可怕

我的问题 – 处理这个问题的最佳做法/简单方法是什么? 我想过一些解决方案 – 覆盖SaveChanges方法遍历所有对象,如果ID不是null / 0 /其他一些约定将其从Added更改为Unchanged – 这个解决方案可以完成吗?

我的第二个问题 – 因为我对NHibernate(连接对象)有很多经验 – 我想知道NHibernate对此有何看法? 我在某处读到NHibernate确实具有重新连接断开的复杂对象的AutoMagic Mergefunction,这是真的吗? 我的基本断开连接的地址 – >城市设计是否会与AutoMagic Merge一起开箱即用? 使用它的后果是什么?

非常感谢 :)

更新:该问题的简化代码。

public class Address { public int ID { get; set; } public virtual City City { get; set; } } public class City { public int ID { get; set; } public string Name { get; set; } public virtual Zone Zone { get; set; } } public class MyContext : DbContext { public MyContext() : base("TransportService") { } public virtual DbSet Cities { get; set; } public virtual DbSet
Addresses { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity
() .HasRequired(x => x.City) .WithMany().WillCascadeOnDelete(true); } }

添加新地址:

  public void Add(AddressDto address) { using (var context = new MyContext()) { context.Addresses.Add(address.FromDto
()); context.SaveChanges(); } }

“FromDto”是通用的Mapper扩展,它使用所有信息创建新地址,包括City(和City.ID属性)

这将导致创建一个新的城市而不是使用对旧城的引用。

我发现EF没有自动合并,它们的合并function到目前为止只是手动合并,只有当Context对象在内存中具有对象的所有依赖关系时才会起作用。

处理多级断开连接的对象,并处理手动重新连接它们是很多工作,并且可能导致非常奇怪且难以处理错误(就像问题中所述的那样,因为它没有合并所以创建了新城市,所以它只是创建了一个新的,即使它有一个ID)

所以现在 – Nhibernate赢得了这场战斗,Nhibernate有一个自动合并function,如果你的断开连接的对象有一个ID它会尝试合并它,并且成功(根据我的经验)这是一个更多的设置来让事情运行相比EF,但值得麻烦。