2013-02-18 61 views
2

我正在使用VS2010与SQL Server 2008 R2。实体框架数据库第一映射程序问题

我是一个完整的初学者在c#和实体框架。

我在下面的例子中遇到的问题是,当我尝试获得与特定选项卡相关的问题时,生成的SQL不正确。我认为这与我在两个引用具有相同名称的相同字段的两个表上有一个Tab_ID外键的事实有关?

但是,当我尝试获取与Checksheets关联的选项卡时,生成的SQL是正确的。我所做的一切都完全一样,但它产生了不同的结果?

任何帮助将不胜感激。

下面我已经附上了使用的方法和输出以及我使用的DB关系模型和映射器。

选项卡相关联与检查表(按预期工作)

public IQueryable<CheckSheetTab> getTabs(int checkSheetId) 
    { 
     //includes the foreign key information when returning Tab 
     var allReturnInfo = CheckSheetTab.Include(x => x.Tab); 
     var result = allReturnInfo.Where(p => p.CheckSheet_ID == checkSheetId); 
     result = result.OrderBy(x => x.Order_ID); 
     return result; 
    } 

SQL生产

{SELECT 
[Extent1].[Table_ID] AS [Table_ID], 
[Extent1].[Tab_ID] AS [Tab_ID], 
[Extent1].[CheckSheet_ID] AS [CheckSheet_ID], 
[Extent1].[Order_ID] AS [Order_ID], 
[Extent2].[Tab_ID] AS [Tab_ID1], 
[Extent2].[Tab_Desc] AS [Tab_Desc] 
FROM [dbo].[tbl_CheckSheet_Tabs] AS [Extent1] 
INNER JOIN [dbo].[tbl_Tabs] AS [Extent2] ON [Extent1].[Tab_ID] = [Extent2].[Tab_ID]} 

问题与标签相关联的(不工作)

 public IQueryable<TabQuestion> getQuestions(int tabId) 
    { 
     //includes the foreign key information when returning Tab 
     var allReturnInfo = TabQuestion.Include(x => x.Question); 
     // NOTE FOR SOME REASON THIS IS NOT CREATING THE CORRECT SQL!!!!!!!!! 
     var result = allReturnInfo.Where(p => p.Tab_ID == tabId); 
     result = result.OrderBy(x => x.Order_ID); 
     return result; 
    } 

SQL PRODUCED - EXTENT 3是个问题,我不知道它为什么产生。

{SELECT 
[Extent1].[Table_ID] AS [Table_ID], 
[Extent1].[Question_ID] AS [Question_ID], 
[Extent1].[Tab_ID] AS [Tab_ID], 
[Extent1].[Order_ID] AS [Order_ID], 
[Extent2].[Question_ID] AS [Question_ID1], 
[Extent2].[Question_Desc] AS [Question_Desc], 
[Extent2].[Parent_ID] AS [Parent_ID], 
[Extent3].[Tab_Tab_ID] AS [Tab_Tab_ID] 
FROM [dbo].[tbl_Tab_Questions] AS [Extent1] 
INNER JOIN [dbo].[tbl_Questions] AS [Extent2] ON [Extent1].[Question_ID] = [Extent2].[Question_ID] 
LEFT OUTER JOIN [dbo].[tbl_Questions] AS [Extent3] ON [Extent1].[Question_ID] = [Extent3].[Question_ID]} 

我创建了以下数据库: (我不尚未有10声誉后的图像,但该链接下面) http://imgur.com/3Jchhlb

我已成立了表映射器,如下所示:

class CheckSheetTabConfiguration : EntityTypeConfiguration<CheckSheetTab> 
{ 
    public CheckSheetTabConfiguration() : base() 
    { 
     HasKey(x => x.Table_ID); 

     Property(p => p.Tab_ID) 
      .HasColumnName("Tab_ID"); 

     Property(p => p.CheckSheet_ID) 
      .HasColumnName("CheckSheet_ID"); 

     Property(p => p.Order_ID) 
      .HasColumnName("Order_ID"); 

     //add the foreign key constraint 
     HasRequired(p => p.Tab) 
      .WithMany() 
      .HasForeignKey(x => x.Tab_ID); 

     HasRequired(p => p.CheckSheet) 
      .WithMany() 
      .HasForeignKey(x => x.CheckSheet_ID); 

     ToTable("tbl_CheckSheet_Tabs"); 
    } 

} 

class TabQuestionConfiguration : EntityTypeConfiguration<TabQuestion> 
{ 
    public TabQuestionConfiguration() 
     : base() 
    { 
     HasKey(x => x.Table_ID); 

     Property(p => p.Tab_ID) 
      .HasColumnName("Tab_ID"); 

     Property(p => p.Question_ID) 
      .HasColumnName("Question_ID"); 

     Property(p => p.Order_ID) 
      .HasColumnName("Order_ID"); 

     //add the foreign key constraint 
     HasRequired(p => p.Question) 
      .WithMany() 
      .HasForeignKey(x => x.Question_ID); 

     HasRequired(p => p.Tab) 
      .WithMany() 
      .HasForeignKey(x => x.Tab_ID); 

     ToTable("tbl_Tab_Questions"); 
    } 
} 

而且我已经设置了类如下:

public class CheckSheetTab 
{ 
    public Int32 Table_ID { get; set; } 
    public Int32 Tab_ID { get; set; } 
    public Int32 CheckSheet_ID { get; set; } 
    public Int32 Order_ID { get; set; } 
    public virtual Tab Tab { get; set; } 
    public virtual CheckSheet CheckSheet { get; set; } 
} 

public class TabQuestion 
{ 
    public Int32 Table_ID { get; set; } 
    public Int32 Question_ID { get; set; } 
    public Int32 Tab_ID { get; set; } 
    public Int32 Order_ID { get; set; } 
    public virtual Question Question { get; set; } 
    public virtual Tab Tab { get; set; } 
} 

* 选项卡配置

class TabConfiguration : EntityTypeConfiguration<Tab> 
{ 
    public TabConfiguration() : base() 
    { 
     HasKey(x => x.Tab_ID); 

     Property(p => p.Tab_Desc) 
      .HasColumnName("Tab_Desc"); 

     ToTable("tbl_Tabs"); 
    } 
} 

* 提问配置

class QuestionConfiguration : EntityTypeConfiguration<Question> 
{ 
    public QuestionConfiguration() : base() 
    { 
     HasKey(x => x.Question_ID); 

     Property(p => p.Question_Desc) 
      .HasColumnName("Question_Desc"); 

     Property(p => p.Parent_ID) 
      .HasColumnName("Parent_ID"); 

     ToTable("tbl_Questions"); 
    } 
} 

* 检查清单配置

class CheckSheetConfiguration : EntityTypeConfiguration<CheckSheet> 
{ 
    public CheckSheetConfiguration() : base() 
    { 
     HasKey(x => x.CheckSheet_ID); 

     Property(p => p.CheckSheet_Desc) 
      .HasColumnName("CheckSheet_Desc"); 

     Property(p => p.Tab_Count) 
      .HasColumnName("Tab_Count"); 

     ToTable("tbl_CheckSheets"); 
    } 
} 

基类

public class CheckSheet 
{ 
    public int CheckSheet_ID { get; set; } 
    public String CheckSheet_Desc { get; set; } 
    public int Tab_Count { get; set; } 
    public List<Tab> tabs { get; set; } 
} 

public class Tab 
{ 
    public int Tab_ID { get; set; } 
    public string Tab_Desc { get; set; } 
    public List<Question> questions { get; set; } 
} 

public class Question 
{ 
    public int Question_ID { get; set; } 
    public int Question_Desc { get; set; } 
    public int Parent_ID { get; set; } 
} 
+0

是prodeuces不正确的SQL上面已经更新 – 2013-02-18 11:13:13

+0

请张贴标签的定义和配置的方法? – 2013-02-18 11:27:36

+0

在不同的表中有两个具有相同名称的列很好。它似乎试图满足你的要求。 看来您的查询将请求所有数据,然后在客户端上对其进行过滤。你可以尝试更纯粹的LINQ方法: \t \t \t'从tabQuestion在TabQuestion回报 \t \t \t \t包括问题 \t \t \t \t其中tabQuestion.Tab_ID = tabId \t \t \t \t为了通过在Order_ID;' – MrFox 2013-02-18 11:32:05

回答

0

我已经找到错误的原因,它是这么简单的东西,我试图将字符串填充为int,我的错误处理是没有达到标准,从而跳过它,而不是记录它,结果错误表现为错误地生成的SQL。

问题:

public class Question 
{ 
    public int Question_ID { get; set; } 
    public int Question_Desc { get; set; } 
    public int Parent_ID { get; set; } 
} 

Resoultion

public class Question 
{ 
    public int Question_ID { get; set; } 
    public string Question_Desc { get; set; } 
    public int Parent_ID { get; set; } 
}