我对Entity Framework还是很陌生,尽管它比NHibernate具有许多优点,但令我失望的是它不支持延迟加载属性。
参加本课:
public class Product
{
public virtual Guid Id {get;set;}
public virtual string Name {get;set;}
public virtual string Details {get;set;}
}
我的计划是使用实体拆分将其映射到两个表:
CREATE TABLE [dbo].[Product](
[Id] [uniqueidentifier] NOT NULL PRIMARY KEY,
[Name] [nvarchar](50) NULL
)
CREATE TABLE [dbo].[ProductDetails](
[Id] [uniqueidentifier] NOT NULL PRIMARY KEY,
[Details] [nvarchar](max) NULL
)
这是我的流利映射:
modelBuilder.Entity<Product>()
.Map(m =>
{
m.Properties(t => new { t.Id, t.Name });
m.ToTable("Product");
})
.Map(m =>
{
m.Properties(t => new { t.Id, t.Details});
m.ToTable("ProductDetails");
});
我希望能够显示产品列表而不加载详细信息字段。但是,每当我加载产品时,它总是会进行INNER JOIN。我希望它仅从Product中读取,但在读取Details属性时再从ProductDetails中读取。
如何做到这一点?
如果不可能,我该如何实现属性的延迟加载?
表拆分是不可接受的,因为这意味着持久性机制决定了域的设计。
根据CodeCaster的答案进行编辑:
域是固定的-我不需要引入ProductDetails实体的解决方案。这个问题是关于持久化现有域模型的。更改域不能回答问题。
如何实现[从拆分表中延迟加载标量属性]?
如果不可能,我该如何实现属性的延迟加载?
如果您像这样更改模型:
public class Product
{
public virtual Guid Id {get;set;}
public virtual string Name {get;set;}
public virtual ProductDetails Details {get;set;}
}
public class ProductDetails
{
public virtual Guid Product_Id {get;set;}
public virtual string Details {get;set;}
}
您可以利用延迟加载,ProductDetails
只有在获取Product.Details
属性时才会在其中进行查询。
[这是否意味着持久性机制决定了域的设计?
实体模型不必是域模型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句