gpt4 book ai didi

nhibernate - NHibernate 上关于 Entity Framework 的导航属性是否有类似的东西?

转载 作者:行者123 更新时间:2023-12-03 07:11:12 24 4
gpt4 key购买 nike

关于 Entity Framework 的导航属性,NHibernate 上是否有类似的东西?例如,代替:

s.Save(new Product { Category = s.Get<Category>("FD"), Name = "Pizza" });

我希望我能写:

s.Save(new Product { CategoryId = "FD", Name = "Pizza" });

我可以通知 NHibernate 不要使用产品类别属性作为保存产品类别的机制吗?我想改用 CategoryId(阅读:我不想使用 DTO)。 Entity Framework 似乎能够帮助完全避免 DTO 模式,同时提供 ORM 的全部好处(可以避免使用导航属性进行联接)。我希望 EF 能够提供两全其美的功能(用于保存对象的精益机制,即无需检索属性的对象)和用于查询内容的导航机制

来自 EF 的示例:http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-code-first-walkthrough.aspx

public class Category
{
public virtual string CategoryId { get; set; }
public virtual string Name { get; set; }

public virtual IList<Product> Products { get; set; }
}

public class Product
{
public virtual int ProductId { get; set; }
public virtual string Name { get; set; }
public virtual string CategoryId { get; set; }

public virtual Category Category { get; set; }
}

[更新]

关于 James 的回答,我尝试在 SQL Server Profiler 中查看 NHibernate 的操作。

// this act didn't hit the Category table from the database
var c = s.Load<Category>("FD");
// neither this hit the Category table from the database
var px = new Product { Category = c, Name = "Pizza" };
// this too, neither hit the Category table from the database
s.Save(px);

只有当你实际访问 Category 对象时,NHibernate 才会访问数据库

Console.WriteLine("{0} {1}", c.CategoryId, c.Name);

最佳答案

如果我理解您的问题,您希望保存带有类别的产品,而不访问数据库来加载类别对象。 NHibernate 绝对支持这一点,并且您几乎拥有正确的代码。以下是在 NHibernate 中执行此操作的方法:

s.Save(new Product { Category = s.Load<Category>("FD"), Name = "Pizza" });

这不会访问数据库来获取实际的类别,但它只会保存具有正确的 Category.Id 的产品。请注意,您不需要(我建议删除 Product.CategoryId)。

现在为什么这适用于 session.Load(),但不适用于 session.Get()...使用 session.Get(),NHibernate 必须返回对象或 null。在 .NET 中,对象无法在事后用 null 替换自身。所以NHibernate被迫去数据库(或者L1缓存)去验证“FD”Category是否确实存在。如果存在,则返回一个对象。如果不是,则必须返回 null。

让我们看看session.Load()。如果数据库中不存在该对象,则会引发异常。因此 NHibernate 可以从 session.Load() 返回一个代理对象并延迟实际访问数据库。当您实际访问该对象时,NHibernate 将检查数据库,如果该对象不存在,则可以在此时抛出异常。在本例中,我们将产品保存到数据库中。 NHibernate 所需要的只是类别的 PK,它在代理中具有该 PK。因此它不必在数据库中查询 Category 对象。 NHibernate 实际上从来不需要水合实际的 Category 对象来满足保存请求。

关于nhibernate - NHibernate 上关于 Entity Framework 的导航属性是否有类似的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5604913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com