繁体   English   中英

有没有办法通过 DbSet<T> 进入页面?

[英]Is there a way to pass the DbSet<T> into the page?

我有页面的窗口。 该页面显示来自我的数据库的数据。 此外,在窗口上放置按钮,其内容根据数据库的表名称。 这些按钮切换页面的内容。

例如,这是btnUsers按钮的点击事件,它显示“用户”表:

void btnUsers_Click(object sender, RoutedEventArgs e) {
    this.FrameMain.Navigate(new pageTable(Context.ctx.Users, ...));
}

pageTable是我的“通用”页面,它接收Users类。 这是它的构造函数,它不起作用:

public pageTable(dynamic table, ...) {
    InitializeComponent();

    TableTemplate<dynamic>.Init(table, ...);
}

这是我的通用类,它在DbSet<T>

static class TableTemplate<T> {
    internal static void Init(T table) {
        foreach (string f in Foo(table, ...) {
            ...
        }
    }
}

Foo方法只是从DbSet<T>表中提取列:

internal static string Foo<T>(T item, ...) {
    ...
}

关键是,当我尝试从表中获取数据时,应用程序终止,在按钮的事件中,使用了这种通用方法。

我注意到,在Foo方法中,在调试期间, T类型是不同的,具体取决于我传递DbSet<T>

  • 如果我显式初始化一个新的类实例(用于测试):

     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方法不起作用。

是否有可能将通用实体类传递到页面中? 我不知道 XAML 是否有通用类支持,以使用通用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类的Init方法:

internal static void Init(List<T> tableList) {
    if (tableList.Count > 0) {
        foreach (string f in Foo(tableList[0], ...) {
            ...
        }
    }
}

如果tableList为空,我还没有弄清楚如何只显示表的列名。 因此,在这种情况下,现在页面显示没有列名称的空DataGrid 尽管如此,我很高兴,这可以做到我想要的。

最后,我要说,间接同意Xerillio 的观点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM