无法插入选择SCOPE_IDENTITY()流畅的nhibernate一对多

时间:2014-08-02 16:10:45

标签: c# fluent-nhibernate

我有一个错误异常:“无法插入select SCOPE_IDENTITY()”。经过几个小时的谷歌搜索后,我发现我的映射文件中有错误。我尝试了所有可能的解决方案,但错误不断出现。
我的映射文件:

public sealed class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Table("dbo.Employee");

        Id(x => x.Id).Column("EmployeeId");
        Map(x => x.Name);
        Map(x => x.Job);
        HasMany(x => x.Phones).KeyColumn("EmployeeId").Table("dbo.Phone")
            .Inverse()
            .Cascade.All();
    }
}
public sealed class PhoneMap : ClassMap<Phone>
{
    public PhoneMap()
    {
        Table("dbo.Phone");
        Id(x => x.Id).Column("PhoneId");
        Map(x => x.PhoneNumber);
        Map(x => x.PhoneType);
        Map(x => x.EmployeeId);
        References(x => x.Employee).Column("EmployeeId").Not.Nullable();
    }
}

Session.SaveOrUpdate()中出现问题 我哪里错了?

4 个答案:

答案 0 :(得分:4)

似乎没有人回答我的问题......
没必要。我自己找到了答案:

public sealed class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Table("dbo.Employee");

        Id(x => x.Id).Column("EmployeeId");
        Map(x => x.Name);
        Map(x => x.Job);
        HasMany(x => x.Phones).KeyColumn("EmployeeId").Table("dbo.Phone").Inverse().Cascade.AllDeleteOrphan();
    }
}
public sealed class PhoneMap : ClassMap<Phone>
{
    public PhoneMap()
    {
        Table("dbo.Phone");
        Id(x => x.Id).Column("PhoneId");
        Map(x => x.PhoneNumber);
        Map(x => x.PhoneType);
        Map(x => x.EmployeeId);
        References(x => x.Employee, "EmployeeId");
    }
}

答案 1 :(得分:0)

我的经验告诉我,通常在发生选择SCOPE_IDENTITY()错误时是由于映射不正确。

确保所有Mapped字段都与数据库中的字段匹配。如果它们是否可以为空,如果你有所有这些的映射,等等。

然后,当您指出引用的多对一关系映射为:

References<TableRelated>(x => x.PropertyRelated, "fieldId");

所以它应该是References<Employee>(x => x.Employee, "EmployeeId");

但这可能是另一个问题(不确定它是否会产生相同的scope_identity错误)

答案 2 :(得分:0)

我有同样的错误。也许它对社区有用。

我找到了发生异常的根:   检查你的&#34; Id&#34;表中的列。 &#39; Id&#39;列应该递增。在创建表格时,有必要将IDENTITY设置为唯一字段:

CREATE TABLE dbo.aTable (ID_User INTEGER NOT NULL PRIMARY KEY IDENTITY(1,1), Name VARCHAR(30)) END

答案 3 :(得分:0)

我有同样的问题。事实证明,我保存的内容超过了我桌子上指定字段所允许的字符数。它被声明为:

(varchar(30), null)

我保存了31个字符,并且发生了相同的消息错误。我只是调整了我的角色长度,一切都恢复了正常。