【问题标题】:NPOCO Save not working only for specific modelNPOCO Save 仅适用于特定型号
【发布时间】:2018-04-27 15:42:35
【问题描述】:

我有一种使用 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。我得出了这个结论:

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

    “不存在从对象类型 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

【问题讨论】:

    标签: c# npoco


    【解决方案1】:

    尝试将主键定义更改为

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 2018-01-21
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 2016-12-27
      相关资源
      最近更新 更多