我有一种使用NPOCO保存的方法,除了一种型号外,它的工作正常。
public bool Upsert<T>(T record, string message)
{
try
{
using (var db = new Database(GetConnStr(), DatabaseType.SqlServer2008))
{
db.Save(record);
return true;
}
}
catch (Exception x)
{
//log exception
return false;
}
}
此代码有效,我正在使用多个模型。但是使用以下模型,它不会保存而不会抛出任何错误:
[PrimaryKey("LoginName")]
public class TableName
{
public string LoginName { get; set; }
public string RealName { get; set; }
public string Tag { get; set; }
}
我已经调试并逐步执行代码并确认模型包含数据,命中了save方法并且没有抛出异常。我已将模型名称更改为错误值并获得正确的错误invalid object name
。但是,当我将其更改回正确的名称时,数据不会保存,也不会引发错误。我使用管理工作室手动将相同的记录插入到数据库中而没有错误(只是为了确保没有隐藏的数据库错误)。
更新
无论出于何种原因,似乎NPOCO
未映射LoginName
。我得出这样的结论:
使用NPOCO SingleById
会引发以下错误:
“对象类型&lt;&gt; f__AnonymousType42`1 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]不存在已知托管提供程序本机类型的映射。“
使用Insert
方法代替Save
。当我这样做时,我得到错误:
“无法将值NULL插入列'LoginName',表'TableName';列不允许空值.INSERT失败。\ r \ n语句已终止。”
即使模型具有所有值,当我通过调试器检查时。
我怀疑save
不会抛出错误,因为它是upsert
。
答案 0 :(得分:1)
尝试将主键定义更改为
[PrimaryKey("LoginName", AutoIncrement=false)]
由于LoginName不是自动增量字段,因此无法添加记录。 AutoIncrement的默认值为True。