Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Performance 如何解决N+;NHibernate中的1对1映射问题?_Performance_Nhibernate_Mapping_One To One - Fatal编程技术网

Performance 如何解决N+;NHibernate中的1对1映射问题?

Performance 如何解决N+;NHibernate中的1对1映射问题?,performance,nhibernate,mapping,one-to-one,Performance,Nhibernate,Mapping,One To One,我有一个任务实体,它有一个前面和后面的任务: namespace OneToOneIssue.Domain { public class Task { public virtual Guid Id { get; set; } public virtual string Description { get; set; } public virtual Task FollowingTask { get; set; } p

我有一个任务实体,它有一个前面和后面的任务:

namespace OneToOneIssue.Domain
{
    public class Task
    {
        public virtual Guid Id { get; set; }
        public virtual string Description { get; set; }
        public virtual Task FollowingTask { get; set; }
        public virtual Task PrecedingTask { get; set; }
    }
}
数据库表如下所示:

CREATE TABLE [dbo].[Task](
    [Id] uniqueidentifier NOT NULL,
    [Description] nvarchar(100) NULL,
    [FollowingTaskId] uniqueidentifier NULL
    CONSTRAINT [PK_Task] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('30efbfda-f3b5-42fb-906e-098fb32be79d', 'Task 1', 'f7367187-406d-47db-931e-b9e4fa8a4774')
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('f7367187-406d-47db-931e-b9e4fa8a4774', 'Task 2', '42c25da5-7c04-4adc-a9c2-6bf8a9ff5c89')
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('42c25da5-7c04-4adc-a9c2-6bf8a9ff5c89', 'Task 3', NULL)
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('ffe58f51-bb85-4681-af9d-d232326a30e4', 'Task 4', 'ba2ee26c-ebbb-4d7e-a596-40db9f0711c4')
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('ba2ee26c-ebbb-4d7e-a596-40db9f0711c4', 'Task 5', '29189134-8be9-4d93-873e-ce5efefe1c1a')
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('29189134-8be9-4d93-873e-ce5efefe1c1a', 'Task 6', NULL)
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('ef069d0a-f2a8-4c9a-8bbc-99ee1e0e2991', 'Task 7', '56a6eb57-ab9f-49cb-875a-a072158b0265')
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('56a6eb57-ab9f-49cb-875a-a072158b0265', 'Task 8', 'f8b7cc9b-269e-44c7-85bf-44592d70a21e')
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('f8b7cc9b-269e-44c7-85bf-44592d70a21e', 'Task 9', NULL)
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               namespace="OneToOneIssue.Domain"
               assembly="OneToOneIssue.Domain">
  <class name="Task" table="`Task`">
    <id name="Id" column="Id" type="guid">
      <generator class="assigned"/>
    </id>
    <property name="Description" column="`Description`" />
    <many-to-one name="FollowingTask" class="Task" column="FollowingTaskId" />
    <one-to-one name="PrecedingTask" class="Task" property-ref="FollowingTask" />
  </class>
</hibernate-mapping>
var tasks = session
                .CreateCriteria<Task>()
                .Add(Restrictions.In("Description", new string[] {"Task 2", "Task 5", "Task 8"}))
                .List<Task>();
映射如下所示:

CREATE TABLE [dbo].[Task](
    [Id] uniqueidentifier NOT NULL,
    [Description] nvarchar(100) NULL,
    [FollowingTaskId] uniqueidentifier NULL
    CONSTRAINT [PK_Task] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('30efbfda-f3b5-42fb-906e-098fb32be79d', 'Task 1', 'f7367187-406d-47db-931e-b9e4fa8a4774')
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('f7367187-406d-47db-931e-b9e4fa8a4774', 'Task 2', '42c25da5-7c04-4adc-a9c2-6bf8a9ff5c89')
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('42c25da5-7c04-4adc-a9c2-6bf8a9ff5c89', 'Task 3', NULL)
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('ffe58f51-bb85-4681-af9d-d232326a30e4', 'Task 4', 'ba2ee26c-ebbb-4d7e-a596-40db9f0711c4')
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('ba2ee26c-ebbb-4d7e-a596-40db9f0711c4', 'Task 5', '29189134-8be9-4d93-873e-ce5efefe1c1a')
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('29189134-8be9-4d93-873e-ce5efefe1c1a', 'Task 6', NULL)
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('ef069d0a-f2a8-4c9a-8bbc-99ee1e0e2991', 'Task 7', '56a6eb57-ab9f-49cb-875a-a072158b0265')
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('56a6eb57-ab9f-49cb-875a-a072158b0265', 'Task 8', 'f8b7cc9b-269e-44c7-85bf-44592d70a21e')
INSERT INTO [Task] ([Id], [Description], [FollowingTaskId]) VALUES ('f8b7cc9b-269e-44c7-85bf-44592d70a21e', 'Task 9', NULL)
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               namespace="OneToOneIssue.Domain"
               assembly="OneToOneIssue.Domain">
  <class name="Task" table="`Task`">
    <id name="Id" column="Id" type="guid">
      <generator class="assigned"/>
    </id>
    <property name="Description" column="`Description`" />
    <many-to-one name="FollowingTask" class="Task" column="FollowingTaskId" />
    <one-to-one name="PrecedingTask" class="Task" property-ref="FollowingTask" />
  </class>
</hibernate-mapping>
var tasks = session
                .CreateCriteria<Task>()
                .Add(Restrictions.In("Description", new string[] {"Task 2", "Task 5", "Task 8"}))
                .List<Task>();
我甚至不需要加载前面的任务

急于加载前面的任务也无济于事

如果我将FollowingTask和precingtask设置为lazy=“proxy”,则没有帮助。如果删除一对一映射,它确实可以解决问题,但这不是一个可能的解决方案

我在这里看到了一些问题,如果你需要一对一的映射,那么你就可以绕过这个问题,而答案似乎是这是一个bug,你必须接受它。但是,我甚至不需要加载它。我从不访问它,它只是无缘无故加载。我相信这个问题也是独一无二的,因为这种关系具有递归性


有没有什么方法可以阻止它加载,或者有没有其他方法可以实现同样的效果?

只是一个建议,如何更改映射。表结构适合父子模式。我们只知道你只想要一个孩子


对于亲子关系,NHibernate提供了强大的支持,您将不再体验相关子关系的加载。因此,如何更改映射,而不仅仅是一个建议。表结构适合父子模式。我们只知道你只想要一个孩子


对于亲子关系,NHibernate提供了强大的支持,您将不再体验相关子关系的加载。因此,它不是一种父子关系,而不是
欢呼,但这改变了模型。一个任务有一个且只有一个前面的任务。我以前曾多次模拟过亲子关系,你是对的,它没有同样的问题。不要误解我。但是taskid
后面有一列
。因此,它是当前记录的父项。(它在您的模型中已恢复,但请深入查看)。在其他
任务Id
中搜索当前
Id
时,可以找到每个(在本例中是一个且唯一的)子级。因此,抽象地说,表结构是父子结构。有一棵很深的树,有一个孩子,一个孩子,一个孩子。。。如果你从虚拟财产中获取第一个要素,你将从世界和独生子女政策中获得利润,有点像中国:)也许_precingtasks集合可以是私有的,并且有一个precingtask属性,其中集合替换唯一的记录,get返回_precingtasks.FirstOrDefault()?这正是我的观点。独生子女政策是您的业务规则。映射已经准备好拥有更多。但正如我所说的,如果虚拟/未映射属性
precisingtask
(末尾没有s)将使用受保护的
precisingtask
列表进行操作。。。你会得到很多。正如我所说,来自两个世界;)谢谢,这是一个有点黑客,但它似乎是一个已知的错误,错误需要解决。这一切都很好,对代码库和数据库的影响最小。我在我的博客上写到:干杯,但这改变了模式,这不是亲子关系。一个任务有一个且只有一个前面的任务。我以前曾多次模拟过亲子关系,你是对的,它没有同样的问题。不要误解我。但是taskid
后面有一列
。因此,它是当前记录的父项。(它在您的模型中已恢复,但请深入查看)。在其他
任务Id
中搜索当前
Id
时,可以找到每个(在本例中是一个且唯一的)子级。因此,抽象地说,表结构是父子结构。有一棵很深的树,有一个孩子,一个孩子,一个孩子。。。如果你从虚拟财产中获取第一个要素,你将从世界和独生子女政策中获得利润,有点像中国:)也许_precingtasks集合可以是私有的,并且有一个precingtask属性,其中集合替换唯一的记录,get返回_precingtasks.FirstOrDefault()?这正是我的观点。独生子女政策是您的业务规则。映射已经准备好拥有更多。但正如我所说的,如果虚拟/未映射属性
precisingtask
(末尾没有s)将使用受保护的
precisingtask
列表进行操作。。。你会得到很多。正如我所说,来自两个世界;)谢谢,这是一个有点黑客,但它似乎是一个已知的错误,错误需要解决。这一切都很好,对代码库和数据库的影响最小。我已经在我的博客上写了: