SQL Server 2008 R2 で VS2010 を使用しています。
私は、c# と Entity Framework の両方の完全な初心者です。
以下の例で私が抱えている問題は、特定のタブに関連付けられた質問を取得しようとすると、生成された SQL が正しくないことです。同じ名前の同じフィールドを参照する2つのテーブルにTab_ID外部キーがあるという事実と関係があると思いますか?
ただし、チェックシートに関連付けられたタブを取得しようとすると、生成された SQL は正しいです。私はすべてまったく同じことをしましたが、異なる結果が得られましたか?
どんな助けでも大歓迎です。
以下に、使用したメソッドと出力、および使用した DB リレーションシップ モデルとマッパーを添付します。
CheckSheets に関連付けられたタブ (期待どおりに動作)
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; }
}