NHibernate Navigation 属性 仅用于加入
NHibernate Navigation Property for joining only
取下面两个实体:-
public class Product
{
public virtual int Id { get; set; }
public virtual string ItemId { get; set; }
}
public class ProductDescription
{
public virtual int Id { get; set; }
public virtual string ItemId { get; set; }
public virtual string Description { get; set; }
}
这两个实体通过 ItemId 关联,但针对产品存储的每个 ItemId 并不总是有 ProductDescription。
我想做的是在 Product 实体中设置一个 ProductDescription 导航 属性 然后我可以在 HQL 中使用它来执行连接等,就像我使用任何其他导航一样 属性。我不希望有外键或任何类型的强制关系。
我的尝试如下:-
public class Product
{
public virtual int Id { get; set; }
public virtual string ItemId => ProductDescription?.ItemId;
public virtual ProductDescription ProductDescription { get; set; }
}
public class ProductMap
{
public ProductMap()
{
Id(x => x.Id);
References(x => x.ProductDescription).Not.Nullable().Column("ItemId").PropertyRef(x => x.ItemId).ForeignKey("none");
}
}
当使用导航 属性 从数据库中读取现有数据时,这工作得非常好,当涉及到连接等时,正如我所期望的那样。
我未解决的问题是关于产品的持久性。当我存储产品时,我不希望它检查与它与 ProductDescriptions 的关系有关的任何事情,我只希望它存储 ItemId,如果以及当具有匹配 ItemId 的 ProductDescription 被持久化时,我执行的任何连接使用导航 属性 应该可以工作。
我的坚持尝试如下:-
new Product
{
ProductDescription = new ProductDescription { ItemId = "SomeId" }
}
这似乎工作得很好,直到我尝试使产品上的 ItemId 不可为空,此时我得到了当你没有在关系的另一边设置 Inverse() 时你得到的常见错误。然而,即使我确实在 ProductDescription 上创建了一个 HasMany 关系并设置了 Inverse,它仍然没有解决问题。
我希望以上概述了我正在尝试做的事情。除了我被迫将 Product 上的 ItemId 设置为 nullable 之外,我几乎可以完全按照我想要的方式工作。
有什么解决办法吗?
好像解决了
public class Product
{
public virtual int Id { get; set; }
public virtual string ItemId { get; set; }
public virtual ProductDescription ProductDescription { get; protected set; }
}
public class ProductMap
{
public ProductMap()
{
Id(x => x.Id);
Map(x => x.ItemId).Not.Nullable();
References(x => x.ProductDescription).Column("ItemId").PropertyRef(x => x.ItemId).ForeignKey("none").ReadOnly();
}
}
这让我可以自由且不受约束地设置关系两侧的项目 ID。导航 属性 也按预期工作。
取下面两个实体:-
public class Product
{
public virtual int Id { get; set; }
public virtual string ItemId { get; set; }
}
public class ProductDescription
{
public virtual int Id { get; set; }
public virtual string ItemId { get; set; }
public virtual string Description { get; set; }
}
这两个实体通过 ItemId 关联,但针对产品存储的每个 ItemId 并不总是有 ProductDescription。
我想做的是在 Product 实体中设置一个 ProductDescription 导航 属性 然后我可以在 HQL 中使用它来执行连接等,就像我使用任何其他导航一样 属性。我不希望有外键或任何类型的强制关系。
我的尝试如下:-
public class Product
{
public virtual int Id { get; set; }
public virtual string ItemId => ProductDescription?.ItemId;
public virtual ProductDescription ProductDescription { get; set; }
}
public class ProductMap
{
public ProductMap()
{
Id(x => x.Id);
References(x => x.ProductDescription).Not.Nullable().Column("ItemId").PropertyRef(x => x.ItemId).ForeignKey("none");
}
}
当使用导航 属性 从数据库中读取现有数据时,这工作得非常好,当涉及到连接等时,正如我所期望的那样。
我未解决的问题是关于产品的持久性。当我存储产品时,我不希望它检查与它与 ProductDescriptions 的关系有关的任何事情,我只希望它存储 ItemId,如果以及当具有匹配 ItemId 的 ProductDescription 被持久化时,我执行的任何连接使用导航 属性 应该可以工作。
我的坚持尝试如下:-
new Product
{
ProductDescription = new ProductDescription { ItemId = "SomeId" }
}
这似乎工作得很好,直到我尝试使产品上的 ItemId 不可为空,此时我得到了当你没有在关系的另一边设置 Inverse() 时你得到的常见错误。然而,即使我确实在 ProductDescription 上创建了一个 HasMany 关系并设置了 Inverse,它仍然没有解决问题。
我希望以上概述了我正在尝试做的事情。除了我被迫将 Product 上的 ItemId 设置为 nullable 之外,我几乎可以完全按照我想要的方式工作。
有什么解决办法吗?
好像解决了
public class Product
{
public virtual int Id { get; set; }
public virtual string ItemId { get; set; }
public virtual ProductDescription ProductDescription { get; protected set; }
}
public class ProductMap
{
public ProductMap()
{
Id(x => x.Id);
Map(x => x.ItemId).Not.Nullable();
References(x => x.ProductDescription).Column("ItemId").PropertyRef(x => x.ItemId).ForeignKey("none").ReadOnly();
}
}
这让我可以自由且不受约束地设置关系两侧的项目 ID。导航 属性 也按预期工作。