插入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值;列不允许为空。插入失败。
有人遇到这个问题吗?我总是遇到障碍。
我也尝试过同样的问题。下面的代码已经很好了。
<>之前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]
不应该工作。