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。导航 属性 也按预期工作。