NHibernate插入...选择...使用GUID作为主键

时间:2012-07-17 18:47:41

标签: c# nhibernate hql

我尝试使用NHibernate进行操作:

this.Session.CreateQuery(@"insert into ContactGroupContact (Id, MailAddress, Company, Person, Branch, ContactGroup, User, FaxNumber)
                             select newid(), MailAddress, Company, Person, Branch, 
                                    :destContactGroupId, User, FaxNumber
                             from ContactGroupContact cgc
                             where cgc.ContactGroup.Id = :contactGroupId")
        .SetEntity("destContactGroupId", tempContactGroup)
        .SetGuid("contactGroupId", contactGroupId)
        .ExecuteUpdate();

Id的{​​{1}}列的类型为ContactGroupContact

当我执行此操作时,我收到GUID,其中包含以下消息:

  

节点没有数据类型:MethodNode((newid exprList)[insert into   ContactGroupContact(Id,MailAddress,Company,Person,Branch,   ContactGroup,User,FaxNumber)    选择newid(),MailAddress,Company,Person,Branch,:destContactGroupId,User,FaxNumber    来自ContactGroupContact cgc    其中cgc.ContactGroup.Id =:contactGroupId]

有人可以帮助我吗,出了什么问题? - 谢谢。

2 个答案:

答案 0 :(得分:1)

尝试创建派生Dialect并将newid注册为函数。

答案 1 :(得分:1)

这是Diego的建议的一个例子。我承认我是新手,但假设这是处理它的适当方式(它有效)

public class DerivedDialectWithNewId : MsSql2005Dialect
{
    public DerivedDialectWithNewId()
    {
        RegisterFunction("newid", new NoArgSQLFunction("newid", NHibernateUtil.Guid, true));        
    }
}

以下是如何将它与Fluent NHibernate一起使用

private static FluentConfiguration GetConfiguration()
    {
        return Fluently.Configure()
            .Database(
                MsSqlConfiguration.MsSql2005.ConnectionString(
                    c => c.FromConnectionStringWithKey("CustomConnectionString"))
                    .Dialect<DerivedDialectWithNewId>()));
    }