Roy*_*del 5 c# nhibernate wcf asp.net-mvc-4 entity-framework-5
我刚刚在几个星期前开始了一个新项目并决定尝试使用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作为特殊功能的属性,而不仅仅是名称)
客户端知道城市列表,并返回一个现有城市的新地址当我尝试添加新地址时,会创建一个新城市,其中包含现有旧城市的数据,我已经知道这是因为EF没有我不知道如何合并断开连接的对象和我读的不支持任何合并,并且简单的不太舒服的解决方案只是管理对象状态 - 将City对象状态更改为Unchanged.
但是使用大型复杂数据库设计来处理这个问题听起来很糟糕
我的问题 - 处理这个问题的最佳做法/简单方法是什么?我想过一些解决方案 - 覆盖SaveChanges方法遍历所有对象,如果ID不是null/0 /其他一些约定将其从Added更改为Unchanged - 这个解决方案可以完成吗?
我的第二个问题 - 因为我对NHibernate(连接对象)有很多经验 - 我想知道NHibernate对此有何看法?我在某处读到NHibernate确实具有重新连接断开的复杂对象的AutoMagic Merge功能,这是真的吗?我的基本断开连接的地址 - >城市设计是否会与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<City> Cities { get; set; }
public virtual DbSet<Address> Addresses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Address>()
.HasRequired(x => x.City)
.WithMany().WillCascadeOnDelete(true);
}
}
Run Code Online (Sandbox Code Playgroud)
添加新地址:
public void Add(AddressDto address)
{
using (var context = new MyContext())
{
context.Addresses.Add(address.FromDto<Address>());
context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
"FromDto"是通用的Mapper扩展,它使用所有信息创建新地址,包括City(和City.ID属性)
这将导致创建一个新城市,而不是使用对旧城市的引用.
我发现EF没有自动合并功能,到目前为止它们的合并功能只是手动合并,并且只有当Context对象在内存中具有该对象的所有依赖项时它才会起作用。
处理多级断开连接的对象以及手动重新连接它们是一项繁重的工作,并且可能会导致非常奇怪且难以处理的错误(就像问题中所述,因为它没有合并而创建了新城市,所以即使它有 ID,它也只是创建了一个新的)
所以现在 - Nhibernate 赢得了这场战斗,Nhibernate 有一个自动合并功能,如果你断开连接的对象有一个 ID,它会尝试合并它,并成功(根据我的经验)与EF,但这是值得的。
| 归档时间: |
|
| 查看次数: |
923 次 |
| 最近记录: |