我使用EF6查询数据库中的数据。数据库存在于代码之前并且属于另一个应用程序,因此我根本无法修改数据库。我相信我正在使用代码优先方法,即使数据库已经存在(原谅我,因为我是EF的新手)。问题是我无法撤回设置如下的列的数据;
[Column("ITEM_QTY")]
public decimal ItemQuantity { get; set; }
现在,如果我将属性重命名为ITEM_QTY,它会正确地提取数据。我不确定我错过了什么。我可以正确地从任何其他字段中提取数据,但无论数据库中有什么内容,此字段都返回0。任何人都可以提供任何指示吗?
在另一个讨论中,有人提出了列名称中下划线可能存在的问题。不确定是否可以,但添加信息。感谢。
编辑:添加用于查询数据库的代码。请注意,这是在我开始处理项目之前设置的,因此遵循相同的约定;
var t = this.Database.SqlQuery<InventoryDb>("select top 100 * from COMPANY_INVENTORY with (NOLOCK) where COMPANY = @CompanyName",
new SqlParameter("CompanyName", companyName)).ToList();
答案 0 :(得分:1)
如果您在Column
上使用自定义SqlQuery<T>
,则会忽略您的DbContext
属性。您需要传递带有与您的实体匹配的属性名称的别名的Sql语句。
var t = this.Database.SqlQuery<InventoryDb>("select top 100 Item_QTY as [ItemQuantity], ... other columns ... from COMPANY_INVENTORY with (NOLOCK) where COMPANY = @CompanyName",
new SqlParameter("CompanyName", companyName)).ToList();
修改强>
是出于好奇而进一步检查,如果您使用Column
,则EF应该尊重DbSet.SqlQuery
属性。我没有试过这个。 (https://msdn.microsoft.com/en-us/library/system.data.entity.dbset.sqlquery(v=vs.113).aspx)
var t = this.Inventory.SqlQuery("select top 100 * from COMPANY_INVENTORY with (NOLOCK) where COMPANY = @CompanyName",
new SqlParameter("CompanyName", companyName)).ToList();