1

我有一种使用 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; }
}

我已经调试并单步执行代码并确认模型包含数据,保存方法被命中并且没有抛出异常。我已将模型名称更改为错误的值并得到正确的错误invalid object name。但是,当我将其改回正确的名称时,数据不会保存,也不会引发错误。我已经使用管理工作室手动将相同的记录插入到数据库中而没有错误(只是为了确保没有隐藏的数据库错误)。

更新: 无论出于何种原因,它似乎NPOCO不是映射LoginName。我通过以下方式得出这个结论:

  1. 使用 NPOCOSingleById会引发以下错误:

    “不存在从对象类型 <>f__AnonymousType42`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 到已知托管提供程序本机类型的映射。”

  2. 使用Insert方法而不是Save. 当我这样做时,我得到了错误:

    “无法将值 NULL 插入到列 'LoginName'、表 'TableName';列不允许空值。INSERT 失败。\r\n语句已终止。”

即使模型具有所有值,当我通过调试器检查它时

我怀疑save不会抛出错误,因为它是upsert.

4

1 回答 1

3

尝试将您的主键定义更改为

[PrimaryKey("LoginName", AutoIncrement=false)]

由于 LoginName 不是自增字段,因此无法添加记录。AutoIncrement 的默认值为 True。

于 2017-11-19T06:04:30.500 回答