有没有办法将 DbSet<T> 传递到页面中?
Is there a way to pass the DbSet<T> into the page?
我有 window 页面。该页面显示来自我的数据库的数据。此外,在 window 上放置了按钮,其内容根据数据库的 table 名称。这些按钮切换页面的内容。
例如,这是btnUsers
按钮的点击事件,显示“用户”table:
void btnUsers_Click(object sender, RoutedEventArgs e) {
this.FrameMain.Navigate(new pageTable(Context.ctx.Users, ...));
}
pageTable
是我的“通用”页面,接收 Users
class。这是它的构造函数,它不起作用:
public pageTable(dynamic table, ...) {
InitializeComponent();
TableTemplate<dynamic>.Init(table, ...);
}
这是我的通用 class,它在 DbSet<T>
:
上运行
static class TableTemplate<T> {
internal static void Init(T table) {
foreach (string f in Foo(table, ...) {
...
}
}
}
Foo
方法只是从 DbSet<T>
table:
中提取列
internal static string Foo<T>(T item, ...) {
...
}
关键是,当我尝试从 table 获取数据时,应用程序终止,在按钮的事件中,使用了这种通用方法。
我注意到,在 Foo
方法中,在调试期间,T
类型有所不同,具体取决于我传递 DbSet<T>
的方式:
如果我显式初始化一个新的 class 实例(用于测试):
static class TableTemplate<T> {
internal static void Init(T table) {
foreach (string f in Foo(new Users(), ...) {
...
}
}
}
,则T
类型为System.Data.Entity.DynamicProxies.Users_E006B3...
,Foo
方法有效;
没有显式初始化 T
类型是 System.Data.Entity.DbSet`1[Namespace.Users]
,Foo
方法不起作用。
是否可以将通用实体 class 传递到页面中?我不知道 XAML 是否有通用的 classes 支持,以使用通用的 pageTable<T>
页面。这可能是一个解决方案,但我想有一种更简洁的方法来传递实体。
我找到了解决方案,它没有使用通用页面。
好吧,当我尝试打印 table
内容时,我发现将结构化查询传递到 TableTemplate.Init()
。我记得,以前从未使用 dbContext.TableClass
作为函数参数,总是将 TableClass
转换为列表。
我承认,我看不懂EntityFramework,没想到会是这样的结果。一般我用的是object
类型,已经忘记为什么用dynamic
类型了...
我决定将 DbSet<T>
转换为列表(据我了解,这是不同的东西)传递给页面的构造函数,而不是 DbSet<T>
。但是,因为我不使用通用页面,所以我将此列表的项目转换为 object
:
void btnUsers_Click(object sender, RoutedEventArgs e) {
this.FrameMain.Navigate(new pageTable(Context.ctx.Users.ToList<object>()));
}
现在,pageTable
页面的构造函数是下一个:
public pageTable(List<object> table) {
InitializeComponent();
TableTemplate<object>.Init(table, ...);
}
然后,TableTemplate
class 的 Init
方法是下一个:
internal static void Init(List<T> tableList) {
if (tableList.Count > 0) {
foreach (string f in Foo(tableList[0], ...) {
...
}
}
}
如果 tableList
为空,我还没有弄清楚如何只显示 table 的列名。因此,在这种情况下,现在页面显示没有列名称的空 DataGrid
。尽管如此,我还是很高兴,这就是我想要的。
最后,我要说的是,间接同意Xerillio。
我有 window 页面。该页面显示来自我的数据库的数据。此外,在 window 上放置了按钮,其内容根据数据库的 table 名称。这些按钮切换页面的内容。
例如,这是btnUsers
按钮的点击事件,显示“用户”table:
void btnUsers_Click(object sender, RoutedEventArgs e) {
this.FrameMain.Navigate(new pageTable(Context.ctx.Users, ...));
}
pageTable
是我的“通用”页面,接收 Users
class。这是它的构造函数,它不起作用:
public pageTable(dynamic table, ...) {
InitializeComponent();
TableTemplate<dynamic>.Init(table, ...);
}
这是我的通用 class,它在 DbSet<T>
:
static class TableTemplate<T> {
internal static void Init(T table) {
foreach (string f in Foo(table, ...) {
...
}
}
}
Foo
方法只是从 DbSet<T>
table:
internal static string Foo<T>(T item, ...) {
...
}
关键是,当我尝试从 table 获取数据时,应用程序终止,在按钮的事件中,使用了这种通用方法。
我注意到,在 Foo
方法中,在调试期间,T
类型有所不同,具体取决于我传递 DbSet<T>
的方式:
如果我显式初始化一个新的 class 实例(用于测试):
static class TableTemplate<T> { internal static void Init(T table) { foreach (string f in Foo(new Users(), ...) { ... } } }
,则
T
类型为System.Data.Entity.DynamicProxies.Users_E006B3...
,Foo
方法有效;没有显式初始化
T
类型是System.Data.Entity.DbSet`1[Namespace.Users]
,Foo
方法不起作用。
是否可以将通用实体 class 传递到页面中?我不知道 XAML 是否有通用的 classes 支持,以使用通用的 pageTable<T>
页面。这可能是一个解决方案,但我想有一种更简洁的方法来传递实体。
我找到了解决方案,它没有使用通用页面。
好吧,当我尝试打印 table
内容时,我发现将结构化查询传递到 TableTemplate.Init()
。我记得,以前从未使用 dbContext.TableClass
作为函数参数,总是将 TableClass
转换为列表。
我承认,我看不懂EntityFramework,没想到会是这样的结果。一般我用的是object
类型,已经忘记为什么用dynamic
类型了...
我决定将 DbSet<T>
转换为列表(据我了解,这是不同的东西)传递给页面的构造函数,而不是 DbSet<T>
。但是,因为我不使用通用页面,所以我将此列表的项目转换为 object
:
void btnUsers_Click(object sender, RoutedEventArgs e) {
this.FrameMain.Navigate(new pageTable(Context.ctx.Users.ToList<object>()));
}
现在,pageTable
页面的构造函数是下一个:
public pageTable(List<object> table) {
InitializeComponent();
TableTemplate<object>.Init(table, ...);
}
然后,TableTemplate
class 的 Init
方法是下一个:
internal static void Init(List<T> tableList) {
if (tableList.Count > 0) {
foreach (string f in Foo(tableList[0], ...) {
...
}
}
}
如果 tableList
为空,我还没有弄清楚如何只显示 table 的列名。因此,在这种情况下,现在页面显示没有列名称的空 DataGrid
。尽管如此,我还是很高兴,这就是我想要的。
最后,我要说的是,间接同意Xerillio。