加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – EF vs Nhibernate合并断开的对象图

发布时间:2020-12-15 05:38:54 所属栏目:百科 来源:网络整理
导读:几周前我刚刚开始了一个新项目,并决定尝试使用EF Code First, 之前我使用过NHIbernate,我喜欢从MS中获得ORM的想法,到目前为止它一直很棒 – 直到我开始制作复杂的物体. 我的项目层次如下: Azure WCF角色 – 使用EF Code First处理DAL. 带有Knockout的MVC 4
几周前我刚刚开始了一个新项目,并决定尝试使用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不知道如何合并断开连接的对象以及我读取的不支持任何合并abitiy,简单不太舒服的解决方案就是管理对象状态 – 将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);

    }
}

添加新地址:

public void Add(AddressDto address)
    {
        using (var context = new MyContext())
        {
            context.Addresses.Add(address.FromDto<Address>());

            context.SaveChanges();
        }
    }

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

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

解决方法

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

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

所以现在 – Nhibernate赢得这场战斗,Nhibernate具有自动合并功能,如果断开连接的对象有ID,它会尝试合并它,并且成功(根据我的经验)与EF相比,它可以更多地设置运行,但值得一试.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读