【问题标题】:NHibernate: Insert entity with identity value set on a different columnNHibernate:插入具有在不同列上设置的标识值的实体
【发布时间】:2011-03-23 16:06:13
【问题描述】:

NHibernate 和 Sql Server 是否可以插入实体并将其中一个列值设置为新生成的标识?

在纯sql中我可以通过添加默认值来做到这一点

创建表:

create table Test
   id int identity,
   name varchar(12),
   parentId int NOT NULL

添加约束:

alter table Test constraint ... default ident_current('Test') for parentId

然后跳过 parentId 或使用 DEFAULT 关键字:

insert into Test values('TEST')
insert into Test values('TEST', DEFAULT)

如果我错了,请纠正我,但我认为上述语句永远不会由 NHibernate 生成?

现在我首先保存我的实体,然后使用新创建的身份对其进行更新。这种情况会破坏 db 结构,因为我必须使该特定列接受 NULL。

起初我虽然这很容易,但现在,几个小时后我仍然找不到答案:/

提前致谢

【问题讨论】:

    标签: nhibernate insert-update scope-identity


    【解决方案1】:

    您可以使用property mapping 中的生成属性来完成此操作。对于数据库设置的默认值,使用generated="insert"。对于 Fluent NHibernate 映射,请使用 .Generated().Insert()

    编辑:

    public class Test
    {
        private Test _parent;
    
        public Test()
        {
            _parent = this;
        }
    
        public Test Parent
        {
            get { return _parent == this ? null : _parent; }
            set { _parent = value ?? this; }
        }
    }
    

    【讨论】:

    • 嗨 Jamie,感谢您提供有关属性的信息,但我想这意味着在设置 generate="insert" 后,如果不刷新实体,我将无法显式指定我的值?
    • 我不知道。如果我理解这个问题,您希望默认父级与对象相同,但当然,您还需要能够设置父级。我将编辑我的答案以展示我如何处理这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2015-10-18
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多