插入0,而不是自动增加主键

本文关键字:增加 插入 | 更新日期: 2023-09-27 18:02:07

我试图为我们的对象创建一个通用的Insert<T>。我是OrmLite的新手,所以我还在研究它。所使用的对象不使用Id属性,它们有一个更详细的名称。

作为一个例子这是一个基本的POCO:

public class Customer
{
    public int CustomerId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    ...etc.
} 

所以主键是CustomerId,通过更多的阅读,我发现OrmLite喜欢使用属性Id为主键。因为我们有一个约定,不能只使用Id作为FK的名称,所以我不能切换。然而,进一步阅读似乎我可以用一个或两个属性来装饰这个属性,并让它工作。

这是我正在处理的:

public class Customer
{
    [AutoIncrement]
    [Alias("CustomerId")]
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    ...
}

我得到一个SqlException,说明如下:

附加信息:不能插入值NULL到列'CustomerId',表"XXX.dbo.Customer";列不允许为空。插入失败

我做了更多的阅读,并认为我可以通过继承接口来解决这个问题。

public class Customer : IHasId<int>
{
    [AutoIncrement]
    [Alias("CustomerId")]
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    ...
}

我已经使用PrimaryKey属性,我仍然得到相同的结果。

有人遇到过这样的问题吗?如果有,你是怎么解的?我很难找到关于这件事的更多信息。

我可以摆脱属性并将属性命名回CustomerId,因此它与db表匹配,它将插入到表中,但它总是将0作为键,这是有意义的,因为它是int的默认值,但当它必须是一个自动递增的主键时,它对我没有帮助。作为旁注,我使用ServiceStack.OrmLite.SqlServer.3.9.71和SQL Server 2008

更新1

所以我今天又看了一遍ServiceStack 3.9版本的文档。OrmLite和通读他们的描述,当我没有带有主键'Id'属性的poco时,我应该怎么做。内容如下:

…按照约定,OrmLite希望它是Id,尽管您可以使用[Alais("DbFieldName")]属性将其映射到具有不同名称的列,或者使用[PrimaryKey]属性告诉OrmLite使用不同的属性作为主键。

我使用了这两个例子,它确实将我的数据插入到SQLDatabase中。但是,它仍然为CustomerId主键插入0。

如果我使用AutoIncrement属性,它会抛出一个SqlException:

类型为"System.Data.SqlClient"的异常。在System.Data.dll中发生SqlException',但未由用户代码处理。附加信息:不能在表dbo.Customer的列CustomerId中插入NULL值;列不允许为空。插入失败。

有人遇到这个问题吗?我总是遇到障碍。

插入0,而不是自动增加主键

我也尝试过同样的问题。下面的代码已经很好了。

<>之前public类{(自动增量)(别名("CustomerId"))公共int Id{获取;设置;}公共字符串FirstName{获取;设置;}公共字符串LastName{获取;设置;}…}之前

问题不是来自ORMLITE,而是来自您的数据库。事实上,列"CustomerId"这是我认为你的表的主键有他的属性"身份"设置为"假"。您必须将其设置为"True"或"Yes",并将"Identity Increment"answers"Identity Seed"设置为1。

在v4.0.40中,servicestack通过命名约定("column_name" == OrmLiteConfig.IdField)检索主键列,如下OrmLiteConfigExtensions.cs中的代码所示:

    internal static bool CheckForIdField(IEnumerable<PropertyInfo> objProperties)
    {
        // Not using Linq.Where() and manually iterating through objProperties just to avoid dependencies on System.Xml??
        foreach (var objProperty in objProperties)
        {
            if (objProperty.Name != OrmLiteConfig.IdField) continue;
            return true;
        }
        return false;
    }

因此,使用[AutoIncrement][Alias]不应该工作。