C# 模型中的子项为空,与引用一起保存时为空<&燃气轮机;

C# 模型中的子项为空,与引用一起保存时为空<&燃气轮机;,c#,fluent-nhibernate,reference,fluent-nhibernate-mapping,C#,Fluent Nhibernate,Reference,Fluent Nhibernate Mapping,我有一个这样声明的对象 public class MyObject { public virtual long MyId { get; set; } public virtual MyChild Child { get; set; } public MyObject() { Child = new MyChild(); } } public class MyChild { public virtual long MyId { g

我有一个这样声明的对象

public class MyObject
{
    public virtual long MyId { get; set; }
    public virtual MyChild Child { get; set; }

    public MyObject()
    {
        Child = new MyChild();
    }
}

public class MyChild
{
    public virtual long MyId { get; set; }
}
CREATE TABLE MyObjects
(
    MyObjectId    bigint    IDENTITY(1,1) NOT NULL,
    ChildId       bigint    NULL
)
我用“空对象”设置子对象,因为我希望在模型中使用空对象而不是空对象

在我的数据库中有这样一个表

public class MyObject
{
    public virtual long MyId { get; set; }
    public virtual MyChild Child { get; set; }

    public MyObject()
    {
        Child = new MyChild();
    }
}

public class MyChild
{
    public virtual long MyId { get; set; }
}
CREATE TABLE MyObjects
(
    MyObjectId    bigint    IDENTITY(1,1) NOT NULL,
    ChildId       bigint    NULL
)
然后在我的映射中

References<MyChild>(x => x.Child, "ChildId");
这样可以保存,但是现在我的对象有一个空的子对象,这不是我想要的行为。我可以使用的方法是在创建新的
MyObject
后将子对象重置为空,但我想看看是否有更好的方法

在“我的对象”中,子对象不需要为null,但如果子对象的ID为0,则需要另存为null

编辑


我们刚刚测试了整个空/重置策略,但它不起作用。对我的模型中任何对象的后续nhibernate请求都会导致暂时性对象错误。

您希望在正常使用和持久使用时有不同的行为。您可以实现自己的EntityPerStor,但这需要很多努力。我更喜欢这种情况下的变通办法,因为这违反了NHibernate的假设

public class MyObject
{
    public virtual long MyId { get; set; }
    public virtual MyChild Child { get; set; }

    protected /*internal*/ virtual MyChild ChildForPersisting
    {
        get { return (MyChild.Id == 0) ? null : Child; }
        set { if (value != null) Child = value; }
    }

    public MyObject()
    {
        Child = new MyChild();
    }
}

// with internal
References(x => x.ChildForPersisting, "ChildId")

// without internal
References(Reveal.Member<MyChild>("ChildForPersisting"), "ChildId")
公共类MyObject
{
公共虚拟长MyId{get;set;}
公共虚拟MyChild子项{get;set;}
受保护的/*内部*/虚拟MyChild用于持久化
{
获取{return(MyChild.Id==0)?null:Child;}
设置{if(value!=null)Child=value;}
}
公共对象()
{
Child=newmychild();
}
}
//内部
引用(x=>x.ChildForPersisting,“ChildId”)
//无内部
参考文献(leaver.Member(“ChildForPersisting”),“ChildId”)

另一种选择是在save eventlistener之前和之后实现,它会对子对象进行null/重置,但仍然需要付出大量的努力。

您希望在正常和持久性使用时有不同的行为。您可以实现自己的EntityPerStor,但这需要很多努力。我更喜欢这种情况下的变通办法,因为这违反了NHibernate的假设

public class MyObject
{
    public virtual long MyId { get; set; }
    public virtual MyChild Child { get; set; }

    protected /*internal*/ virtual MyChild ChildForPersisting
    {
        get { return (MyChild.Id == 0) ? null : Child; }
        set { if (value != null) Child = value; }
    }

    public MyObject()
    {
        Child = new MyChild();
    }
}

// with internal
References(x => x.ChildForPersisting, "ChildId")

// without internal
References(Reveal.Member<MyChild>("ChildForPersisting"), "ChildId")
公共类MyObject
{
公共虚拟长MyId{get;set;}
公共虚拟MyChild子项{get;set;}
受保护的/*内部*/虚拟MyChild用于持久化
{
获取{return(MyChild.Id==0)?null:Child;}
设置{if(value!=null)Child=value;}
}
公共对象()
{
Child=newmychild();
}
}
//内部
引用(x=>x.ChildForPersisting,“ChildId”)
//无内部
参考文献(leaver.Member(“ChildForPersisting”),“ChildId”)

另一种选择是在save eventlistener之前和之后实现,它会将子对象设为null/重置,但仍然需要付出很多努力。

我做了一个版本的建议。我使用了一个私有局部变量,在将局部属性设置为新实例后,如果属性为null,我的属性将返回子对象的新实例。我让我的父对象保存“空”子对象,然后在用户输入适当的数据时更新它们。我使用了一个私有局部变量,在将局部属性设置为新实例后,如果属性为null,我的属性将返回子对象的新实例。我让父对象保存“空”子对象,然后在用户输入适当的数据时更新它们。