0

我正在尝试以只读模式将 ASP.NET Core Web 应用程序连接到现有的、非常复杂的数据库。

数据库非常复杂,无法将其布局直接映射到 EFC,我只是通过一组查询访问它的数据。这些查询是明确定义的,因此我可以毫无问题地提前定义与其结果匹配的对象。

但是,我似乎不知道如何为此定义数据库上下文的实体模型。当然,我不能在模型类上设置TableAttribute - 因为模型不反映一个表,而只是一个查询结果。只是将ColumnAttribute添加到模型的属性中似乎也不起作用,在数据库上下文中的OnModelCreating方法中,我总是收到错误“InvalidOperationException:实体类型'MyEntityModel'需要定义一个键。”

我应该定义什么键?好像查询没有其结果条目的键,或者它/我可以让它有一个吗?

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

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

虽然看起来使用基本的连接查询断开无 EF 解决问题可能是可能的,但在我看来,采用 DtabaseContext/EF 方式更符合 ASP.NET Core 的原则。如果我在那里错了,请随时不同意或告诉我。

任何可能显示另一种方法来完成这项工作的样本也将受到高度赞赏。

4

2 回答 2

0

好吧,我自己想通了。似乎问这个问题帮助了我的谷歌。;)

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

我的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));
        });
}

......经过一番摆弄以获取正确的属性类型(到底谁将日期列定义为数字?!)现在一切正常。是的,我认为您的 Entity 类型的属性类型必须与查询结果匹配,并且所有查询字段都必须显示为属性。当然,您应该有一个“唯一”属性作为您的任意属性Key,但它不必是数据库表键。

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

于 2016-08-03T15:01:50.980 回答
0

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

1- ASP.NET Core 2(目前处于测试阶段)在 .NET Standard 2 上运行良好。由于完整的 .NET Framework 4.6.1+ 和 .NET Core 2.0+ 都是 .NET Standard 2.0 的实现,因此您可以切换回 . NET Core 2 在其稳定版本发布时非常容易。

2- Entity Framework Core 2.0(目前处于测试阶段)与 Entity Framework Core 1.1.1 相比有很多增强。使用 2.0 版将比 1.1.1 版容易得多,它具有更好的查询翻译、更好的性能、更少的错误、更多的方法等。

所以

第 1 步 >> 使用 ASP.NET Core 和完整版 EntityFramework & .NET Framework 开发应用程序

第 2 步 >> 当 .NET Core 2 和 Entity Framework Core 2 稳定版本可用时,在您的应用中定位它们。

最好使用 Entity Framework full 的数据库逆向工程工具,然后更改其结果以使其与 EntityFramework Core 兼容。

于 2017-06-10T06:16:58.107 回答