我正在尝试为对象创建通用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
作为主键。由于我们有一个惯例,我不能只为FK使用名称Id
,我无法切换。然而,进一步阅读似乎我可以使用一个或两个属性装饰属性并让它工作。
这就是我正在使用的:
public class Customer
{
[AutoIncrement]
[Alias("CustomerId")]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
...
}
我得到SqlException
说明以下内容:
其他信息:无法将值NULL插入列&#39; CustomerId&#39;, table&#39; XXX.dbo.Customer&#39 ;;列不允许空值。 INSERT失败
我做了一些阅读,并认为我可以通过继承接口来解决问题。
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
所以我今天再次阅读了3.9版ServiceStack.OrmLite的文档,并阅读了他们的描述,当我没有POCO的时候,我应该做些什么&#39; Id&#39;主键的属性。它如下:
...按惯例,OrmLite希望它是Id,尽管您可以使用[Alais(&#34; DbFieldName&#34;)]属性将其映射到具有不同名称的列或使用[PrimaryKey]属性告诉OrmLite使用不同的属性作为主键。
我使用了两个示例,实际上它确实将我的数据插入到SQLDatabase中。但是,它仍然为CustomerId主键插入0。
如果我使用AutoIncrement属性,则会抛出SqlException:
类型&#39; System.Data.SqlClient.SqlException&#39;的异常发生在System.Data.dll中但未由用户代码处理。附加信息:无法将值NULL插入列&#39; CustomerId&#39;,table&#39; dbo.Customer&#39 ;;列不允许空值。 INSERT失败。
有没有人遇到过这个问题?我一直遇到障碍。
答案 0 :(得分:2)
i experimented the same issue. Your following code was already good.
public class Customer { [AutoIncrement] [Alias("CustomerId")] public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } ... }
The problem don't come from ORMLITE but from your database. Indeed, the column "CustomerId" which is i think the primary key for your table have his property "Identity" set to "False". You must set it to "True" or "Yes" and also set "Identity Increment" and "Identity Seed" to 1.
答案 1 :(得分: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]
一起使用不应有效。