如何从带有EntityFrameworkCore的查询生成实体模型

本文关键字:查询 实体模型 EntityFrameworkCore | 更新日期: 2023-09-27 18:00:05

我正在尝试连接一个ASP。NET核心web应用程序到一个现有的、非常复杂的数据库,处于只读模式。

数据库太复杂了,无法直接将其布局映射到EFC,我只是通过一组查询从中访问数据。这些查询定义良好,因此我可以毫无问题地预先定义与结果匹配的对象。

然而,我似乎找不到如何为此定义数据库上下文的实体模型。当然,我不能在模型类上设置TableAttribute,因为模型不反映表,只是反映查询结果。仅仅将ColumnAttributes添加到模型的属性似乎也没有效果,在数据库上下文中的OnModelCreating方法中,我总是收到错误"InvalidOperationException:实体类型'MyEntityModel'需要定义一个键。"

我应该定义什么密钥,tho?这并不是说查询的结果条目有一个键,或者它/我可以让它有一个吗?

不幸的是,我无法更改数据库以添加新视图、临时表或其他任何内容,我只能拥有读取权限。

很可能我还没有理解EF背后的概念,但我看到的所有教程/示例都只处理最基本和最简单的案例,我的谷歌功能似乎也让我失望了。

虽然使用基本的连接查询断开与EF的连接来解决这个问题似乎是可能的,但在我看来,使用DtabaseContext/EF的方式更符合ASP。NET核心的原则。如果我错了,可以不同意或告诉我其他的。

任何可能展示这项工作另一种方法的样本都将受到高度赞赏。

如何从带有EntityFrameworkCore的查询生成实体模型

好吧,我自己想好了。似乎问这个问题帮助了我在谷歌上的搜索。)

对于其他遇到同样问题的人:

我的OnModelCreating函数现在看起来像这个

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<MyEntityType>(
        obj =>
        {
            obj.Property<int>(nameof(MyEntityType.ArbitraryPropertyIChoseAsId));
            obj.HasKey(nameof(MyEntityType.ArbitraryPropertyIChoseAsId));
        });
}

……经过一番修改,属性的类型正确无误(到底是谁把日期列定义为数字?!),现在一切都正常了。是的,实体类型的属性类型必须与查询结果匹配,我认为所有查询字段都必须显示为属性。当然,您应该有一个"唯一"属性作为任意的Key,但它不一定是数据库表键。

这一切都导致了一个略显丑陋的实体类;我通过使MyEntityType成为一个包装类来处理这一问题,该包装类具有对我将用作应用程序中的数据模型的类的隐式转换运算符(它看起来非常整洁,并且具有适当的类型)。

使用ASP。NET核心并不意味着你必须使用实体框架核心。您可以使用Full。NET Framework而不是。NET核心和实体框架完整而不是实体框架核心。这有几个好处:

1-ASP。NET Core 2(目前处于测试版)在上运行良好。NET标准2。两者都已满。NET Framework 4.6.1+和。NET Core 2.0+的实现。NET标准2.0,您可以切换回。NET Core 2在其稳定版本发布时非常容易。

2-实体框架核心2.0(目前处于测试版)比实体框架核心1.1.1有很多增强。使用2.0版本将比1.1.1容易得多它具有更好的查询翻译、更好的性能、更少的错误、更多的方法等。

所以

步骤1>>使用ASP开发应用程序。NET核心和完整版本的EntityFramework&NET框架

步骤2>>目标。NET核心2和实体框架核心2,当它们的稳定版本可用时。

最好使用EntityFrameworkfull的数据库逆向工程工具,然后更改其结果,使其与EntityFrameworkCore兼容。