Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将值NULL插入到具有2个父项的列-NHibernate实体中_C#_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# 无法将值NULL插入到具有2个父项的列-NHibernate实体中

C# 无法将值NULL插入到具有2个父项的列-NHibernate实体中,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,{“无法将值NULL插入列'RootID',表'Legacy.dbo.Middle';列不允许NULL。insert失败。\r\n语句已终止。”} 我有底层阶级、中产阶级和底层阶级。根类的子类为“中间”,然后中间类的子类为“底部”。然而,在这个设计糟糕的遗留数据库中,还从“底部”引用了“根” 根表 CREATE TABLE [dbo].[Root]( [RootID] [int] IDENTITY(1,1) NOT NULL, [RootName] [varchar](max

{“无法将值NULL插入列'RootID',表'Legacy.dbo.Middle';列不允许NULL。insert失败。\r\n语句已终止。”}

我有底层阶级、中产阶级和底层阶级。根类的子类为“中间”,然后中间类的子类为“底部”。然而,在这个设计糟糕的遗留数据库中,还从“底部”引用了“根”

根表

  CREATE TABLE [dbo].[Root](
    [RootID] [int] IDENTITY(1,1) NOT NULL,
    [RootName] [varchar](max) NOT NULL,
 CONSTRAINT [PK_Root] PRIMARY KEY CLUSTERED 
(
    [RootID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
中间桌

   CREATE TABLE [dbo].[Middle](
        [MiddleID] [int] IDENTITY(1,1) NOT NULL,
        [MiddleName] [varchar](max) NOT NULL,
        [RootID] [int] NOT NULL,
     CONSTRAINT [PK_Middle] PRIMARY KEY CLUSTERED 
    (
        [MiddleID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
底桌

 CREATE TABLE [dbo].[Bottom](
        [BottomID] [int] IDENTITY(1,1) NOT NULL,
        [BottomName] [varchar](max) NOT NULL,
        [MiddleID] [int] NOT NULL,
        [RootID] [int] NOT NULL,
     CONSTRAINT [PK_Bottom] PRIMARY KEY CLUSTERED 
    (
        [BottomID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
外键

  ALTER TABLE [dbo].[Middle]  WITH CHECK ADD  CONSTRAINT [FK_Middle_Root] FOREIGN KEY([RootID])
    REFERENCES [dbo].[Root] ([RootID])
    GO

    ALTER TABLE [dbo].[Middle] CHECK CONSTRAINT [FK_Middle_Root]

    ALTER TABLE [dbo].[Bottom]  WITH CHECK ADD  CONSTRAINT [FK_Bottom_Middle] FOREIGN KEY([MiddleID])
    REFERENCES [dbo].[Middle] ([MiddleID])
    GO

    ALTER TABLE [dbo].[Bottom] CHECK CONSTRAINT [FK_Bottom_Middle]
    GO

ALTER TABLE [dbo].[Bottom]  WITH CHECK ADD  CONSTRAINT [FK_Bottom_Root] FOREIGN KEY([RootID])
REFERENCES [dbo].[Root] ([RootID])
GO

ALTER TABLE [dbo].[Bottom] CHECK CONSTRAINT [FK_Bottom_Root]
c#实体

公共类根目录
{
公共根()
{
MIDLES=新分拣集();
}
公共int RootID{get;set;}
公共字符串RootName{get;set;}
公共ISet中间层{get;set;}
}
中产阶级
{
公营中学()
{
底部=新分拣集();
}
public int MiddleID{get;set;}
公共根
{
得到;
设置
}
公共字符串MiddleName{get;set;}
公共ISet底部{get;set;}
}
公共阶级底层
{
public int BottomID{get;set;}
公共根根{get;set;}
公共中间{get;set;}
公共字符串名{get;set;}
}
我通过FluentNHibernate使用以下映射,但我尝试了大量的变体,只是无法以任何方式使其工作

public class RootMap : IAutoMappingOverride<Root>
{
    public void Override(AutoMapping<Root> mapping)
    {
        mapping.Not.LazyLoad();
        mapping.Id(x => x.RootID);
        mapping.HasMany(x => x.Middles).KeyColumn("RootID").Cascade.AllDeleteOrphan().Inverse();
    }
}

public class MiddleMap : IAutoMappingOverride<Middle>
{
    public void Override(AutoMapping<Middle> mapping)
    {
        mapping.Not.LazyLoad();
        mapping.Id(x => x.MiddleID);
        mapping.References(x => x.Root);
        mapping.HasMany(x => x.Bottoms).KeyColumn("MiddleID").Cascade.AllDeleteOrphan();
    }
}

public class BottomMap : IAutoMappingOverride<Bottom>
{
    public void Override(AutoMapping<Bottom> mapping)
    {
        mapping.Not.LazyLoad();
        mapping.Id(x => x.BottomID);
        mapping.References(x => x.Root);
        mapping.References(x => x.Middle);
    }
}
公共类根映射:IAutoMappingOverride
{
公共无效替代(自动映射)
{
mapping.Not.LazyLoad();
map.Id(x=>x.RootID);
mapping.HasMany(x=>x.Middles).KeyColumn(“RootID”).Cascade.AllDeleteOrphan().Inverse();
}
}
公共类MiddleMap:IAutoMappingOverride
{
公共无效替代(自动映射)
{
mapping.Not.LazyLoad();
mapping.Id(x=>x.MiddleID);
mapping.References(x=>x.Root);
mapping.HasMany(x=>x.Bottoms).KeyColumn(“MiddleID”).Cascade.AllDeleteOrphan();
}
}
公共类BottomMap:IAutoMappingOverride
{
公共无效替代(自动映射)
{
mapping.Not.LazyLoad();
map.Id(x=>x.BottomID);
mapping.References(x=>x.Root);
mapping.References(x=>x.Middle);
}
}

您需要将关系的多值端声明为“反向”。参见第6.4节最后一段:

希望有时间让人们回答这个问题。。。我想我有一个解决方案,在聚合“Root”上使用构造函数和工厂方法。我尝试了这个方法,然后得到了“不能将null值插入表dbo.Bottom上的RootID列”。不过我会给你一个+1,因为这是第一次有人解释了“Inverse()”部分,而且有意义可能您还需要在“HasMany(bottoms)”部分使用“inverse”。你还应该在引用上声明.Not.Nullable()。@Oskarbergren你说得对,把我从痛苦中救了出来值得欣赏的伴侣。
public class RootMap : IAutoMappingOverride<Root>
{
    public void Override(AutoMapping<Root> mapping)
    {
        mapping.Not.LazyLoad();
        mapping.Id(x => x.RootID);
        mapping.HasMany(x => x.Middles).KeyColumn("RootID").Cascade.AllDeleteOrphan().Inverse();
    }
}

public class MiddleMap : IAutoMappingOverride<Middle>
{
    public void Override(AutoMapping<Middle> mapping)
    {
        mapping.Not.LazyLoad();
        mapping.Id(x => x.MiddleID);
        mapping.References(x => x.Root);
        mapping.HasMany(x => x.Bottoms).KeyColumn("MiddleID").Cascade.AllDeleteOrphan();
    }
}

public class BottomMap : IAutoMappingOverride<Bottom>
{
    public void Override(AutoMapping<Bottom> mapping)
    {
        mapping.Not.LazyLoad();
        mapping.Id(x => x.BottomID);
        mapping.References(x => x.Root);
        mapping.References(x => x.Middle);
    }
}