【问题标题】:LINQ to SQL DataContext.Translate and properties with name different than the sourceLINQ to SQL DataContext.Translate 和名称与源不同的属性
【发布时间】:2008-10-17 00:16:38
【问题描述】:

我正在处理一些表,我希望 C# 类具有与基础表列不同的属性名称。但是,当我使用 Translate 方法读取结果时,与源名称不匹配的属性永远不会被填充。即使我使用 Linq 生成 SQL。

例如,我的表在 DB 中是这样定义的:

CREATE TABLE User_Entry (
    UserId int IDENTITY (1, 1) NOT NULL,
    Login_Id varchar (50) NOT NULL,
    Active char(1) NOT NULL,
    PASSWORD varchar(75) NULL
)

这是它映射到的类(由 LINQ 设计器生成...LINQ 属性和其他为简洁而省略的内容):

public partial class User
{
    int UserId;
    string Login;
    string Active,
    string Pwd
}

当我执行以下操作时,不会填充 Login 和 Pwd 属性,但会填充 UserId 和 Active 属性。

Data.DbContext db = new Data.DbContext();

IQueryable query = db.Users.Where(usr => usr.Login == request.LoginString);

SqlCommand cmd = (SqlCommand)data.GetCommand(query);

... execute the command (asynchronously) ...

User user = db.Translate<User>( dataReaderResult ).FirstOrDefault();

!此时,我检查了用户对象,我可以看到 Login 和 Pwd 列没有填充!

这是生成的sql:

exec sp_executesql N'SELECT [t0].[UserID] AS [UserId], [t0].[Login_ID] AS [Login], [t0].[Active], [t0].[PASSWORD] AS [Pwd]
FROM [dbo].[User_Entry] AS [t0]
WHERE [t0].[Login_ID] = @p0', N'@p0 varchar(13)', @p0 = 'test_user'

最初,当 UserId 列具有不同的属性名称时,我得到了一个异常 The required column [UserId] does not exist in the results。我环顾四周,看到一些 MSFT 人员的回复说这是一个错误。

这有关系吗?它曾经修复过吗?有谁知道什么时候修复?

编辑:更多信息。

我认为与此相关的错误有 Kathy Lu MSFT 在 2007 年 8 月 14 日here 的评论,她说:

感谢您报告此问题。根据您的问题,我们能够重现该问题,并且产品团队正在研究适当的分类和解决方案。

我想知道这是否与我正在经历的事情有关,以及我是否可以获得更多信息。我搜索了linq translate site:connect.microsoft.com,但没有找到任何东西。

【问题讨论】:

  • 这是 Visual Studio 2008 SP1 (.Net 3.5 SP1)
  • 在 .Net 4.0 中似乎仍然是一个问题
  • Microsoft 停止开发它,这就是我停止使用 LinqToSql 转而使用 Dapper 的原因。

标签: c# .net sql-server linq-to-sql


【解决方案1】:

列属性设置是否正确?有一个名称属性。

http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.columnattribute_members.aspx

另外,Translate's documentation...你想被映射(如第一个要点)。


将结果中的列与对象中的字段和属性匹配的算法如下:

  • 如果字段或属性映射到特定的列名,则该列名应出现在结果集中。
  • 如果未映射字段或属性,则结果集中需要与字段或属性同名的列。
  • 首先通过查找区分大小写的匹配来执行比较。如果未找到此匹配项,则会对不区分大小写的匹配项进行后续搜索。

哦,等等,您正在使用通用翻译重载。使用 Type 参数尝试 Translate 重载,看看是否对您更好。

【讨论】:

  • 感谢您的回答。我检查了你提到的所有内容。我的列属性在设计器生成它们时已正确设置。我还尝试使用 Translate(typeof(User), dataReaderResult); 进行测试。但它有同样的问题。查看添加到我的帖子中的其他信息,我认为这是相关的。
【解决方案2】:

我认为与此相关的错误有 Kathy Lu MSFT 于 2007 年 8 月 14 日发表的评论,她说“感谢您报告此问题。从您的问题中,我们能够重现该问题,并且产品团队正在调查适当的分类和解决方案。”来自https://forums.microsoft.com/msdn/ShowPost.aspx?PostID=1983746&SiteID=1&pageid=0

我想知道这是否与我正在经历的事情有关,以及是否可以获得更多信息。我搜索了(linq translate site:connect.microsoft.com),但没有找到任何东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多