Dapper 在从数据库执行 select 时正在访问我的 class 的所有属性,即使它不应该访问
Dapper is accessing all properties of my class when doing a select from the database even when it should not
我正在使用 jquery 数据 table 来显示 table 数据。 table 仅显示我的 SqlFunction 中的 3 列。
我是这样使用dapper的:
IQueryable<MyClass> data = null;
// Execute my sql statement and map the resultant fields into MyClass properties
data = sqlCon.Query<MyClass>("SELECT field1, field2, field3, FROM dbo.MySqlFunction()", selector.Parameters).AsQueryable();
在上面的代码中“selector”是一个Dapper.SqlBuilder.
MyClass 有一个 属性:
public List<Address> MailingAddresses
{
get
{
if (_MailingAddresses == null)
{
_MailingAddresses = new List<Address>();
}
if (_MailingAddresses.Count == 0)
{
Address temp = new Address();
_MailingAddresses.Add(temp);
}
return _MailingAddresses;
}
set
{
_MailingAddresses = value;
}
}
即使我的 sql 函数中只有 select 3 个字段,并告诉 dapper 将其映射到 MyClass 的 IQueryable,但执行 MailingAddresses get 访问器。我有从地址 class 中的缓存或数据库读取美国各州的代码,这就是我什至发现这种情况发生的方式。
我没有在第一页的任何地方访问 MailingAddresses 属性(该页面只列出了一个 table,其中包含来自 MyClass 的 3 个字段。)
我已将范围缩小到 Dapper 是罪魁祸首。我复制了我的 MyClass 并删除了 MailingAddresses 属性,它不再尝试 运行 从数据库中获取状态列表的代码。
我看到了各种防止 Dapper 访问 Insert/Update 上的属性的参考资料,但它们在 select 上不起作用。它们是 Dapper.Contrib 的 [Computed] 和 Dapper.Rainbow.
的 [IgnoreProperty(true)]
如何在执行 SQL Select 时阻止 Dapper 访问未引用的属性?
Stack Trace of Break Point on getter
编辑
Full Stack Trace
现在我认为它可能一点也不精致(这是一种解脱),但序列化为 json。有没有办法让序列化忽略属性?
以下是我如何 return 从控制器向我的视图发送数据:
return Json(new { draw = draw, recordsFiltered = recordsFiltered, recordsTotal = recordsFiltered, data = recs });
这不是 Dapper 造成的,而是 JsonSerializer
访问 属性 造成的。
如果您将 [JsonIgnore]
属性添加到您的 属性,则 JsonSerializer
将无法访问它
我正在使用 jquery 数据 table 来显示 table 数据。 table 仅显示我的 SqlFunction 中的 3 列。
我是这样使用dapper的:
IQueryable<MyClass> data = null;
// Execute my sql statement and map the resultant fields into MyClass properties
data = sqlCon.Query<MyClass>("SELECT field1, field2, field3, FROM dbo.MySqlFunction()", selector.Parameters).AsQueryable();
在上面的代码中“selector”是一个Dapper.SqlBuilder.
MyClass 有一个 属性:
public List<Address> MailingAddresses
{
get
{
if (_MailingAddresses == null)
{
_MailingAddresses = new List<Address>();
}
if (_MailingAddresses.Count == 0)
{
Address temp = new Address();
_MailingAddresses.Add(temp);
}
return _MailingAddresses;
}
set
{
_MailingAddresses = value;
}
}
即使我的 sql 函数中只有 select 3 个字段,并告诉 dapper 将其映射到 MyClass 的 IQueryable,但执行 MailingAddresses get 访问器。我有从地址 class 中的缓存或数据库读取美国各州的代码,这就是我什至发现这种情况发生的方式。
我没有在第一页的任何地方访问 MailingAddresses 属性(该页面只列出了一个 table,其中包含来自 MyClass 的 3 个字段。)
我已将范围缩小到 Dapper 是罪魁祸首。我复制了我的 MyClass 并删除了 MailingAddresses 属性,它不再尝试 运行 从数据库中获取状态列表的代码。
我看到了各种防止 Dapper 访问 Insert/Update 上的属性的参考资料,但它们在 select 上不起作用。它们是 Dapper.Contrib 的 [Computed] 和 Dapper.Rainbow.
的 [IgnoreProperty(true)]如何在执行 SQL Select 时阻止 Dapper 访问未引用的属性?
Stack Trace of Break Point on getter
编辑 Full Stack Trace
现在我认为它可能一点也不精致(这是一种解脱),但序列化为 json。有没有办法让序列化忽略属性?
以下是我如何 return 从控制器向我的视图发送数据:
return Json(new { draw = draw, recordsFiltered = recordsFiltered, recordsTotal = recordsFiltered, data = recs });
这不是 Dapper 造成的,而是 JsonSerializer
访问 属性 造成的。
如果您将 [JsonIgnore]
属性添加到您的 属性,则 JsonSerializer