NHibernate导航属性仅用于加入

时间:2016-11-23 13:53:55

标签: nhibernate fluent-nhibernate

采取以下两个实体: -

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,我使用Navigation属性执行的任何连接都应该有效。

我坚持不懈的尝试如下: -

new Product
{
    ProductDescription = new ProductDescription { ItemId = "SomeId" }
}

这似乎工作得非常好,直到我尝试让产品上的ItemId不可为空,此时我得到你在通过另一方设置Inverse()时得到的常见错误。但是,即使我在ProductDescription上使用Inverse set创建了HasMany关系,它仍然没有解决问题。

我希望以上概述我要做的事情。我可以让它几乎完全按照我的要求工作,除了我被迫使产品上的ItemId可以为空。

任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

似乎解决了它。

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