1

我开始从事我的第一个 EF 项目。

我想在我的解决方案中将 EF 作为单独的类库......

这就是它的外观: http ://shrani.si/f/3/Xh/32C70yts/ef5.jpg

我已经开始使用现有数据库并将其导入新的类库(作为 DbModel)我已经将所有引用导入到 MVC4 项目中,所以我能够使用现有的实体类(对于 DbModel.tt, - 比如 User.cs。 ..)

只要我使用这些类(数据库表)一切正常......我可以创建新的控制器......编辑数据,写入数据库......

但是当我尝试编写自己的模型类而不是尝试创建新的控制器(具有 R/W 的 MVC 控制器......使用 EF)时,我收到错误 - 不支持的上下文类型

当然可以创建空的控制器。

我没有在 DB 或 Model first 上找到太多信息(只有真正的基础帮助),大多数信息都是关于 Code first 的方法。

我的 Db 最后应该有大约 100 个表……如果这在 EF 中意味着什么的话。

4

1 回答 1

1

您的问题很难理解,但我假设您正在寻找一个将 Mvc4 与实体框架数据库一起使用的小方向。

我不太明白您的错误,但是您的句子“当我尝试编写自己的模型类时……”让我想到了以下几点:

  • 使用数据库优先,您不需要编写实体。它们是从 edmx 文件自动为您生成的。
  • 如果您正在使用您的实体编写一些额外的实体类,则该类需要从现有实体继承,以便它与上下文中的某些内容相匹配。
  • 如果您在 Model 文件夹中编写一个类来表示与数据库完全无关的内容,那么您的上下文应该无关紧要。例如,如果您正在编写一个名为 Status 的类,它表示未存储在数据库中的当前应用程序状态,它不应该关心您的上下文。只有实体框架创建的对象才需要上下文。
  • 您不需要首先使用数据库编写上下文对象。上下文的默认名称是<database name>Entities. 我通常会更改它,<database name>_entities因为我的数据库名称通常带有下划线。该对象应该在与您放置 edmx 文件的位置相同的目录/命名空间中找到。
  • 您的错误听起来像是您编写了自己的上下文。如果 edmx 一切顺利,您应该不需要编写一行代码来连接数据库。您需要在您的 Web.config 文件中有一个连接字符串,但是如果您按照下面解释的 edmx 向导进行操作,这应该会自动发生。

你提到了一个类库。我经常这样做,在公共库中共享模型逻辑:

  • 模型是否在 Model 命名空间中实际上并不重要。他们可能来自任何地方。以上几点仍然适用于实体框架的东西
  • 在您的视图中,您将需要使用在您的库中找到的任何模型的完整命名空间名称。例如,如果您在名为 DbModel 的模型项目中名为 DB 的文件夹中有一个实体,则您的@model声明会说该模型是DbModel.DB.my_entity.
  • 您需要在 Web.config 文件中包含数据库的连接字符串。它不会从库 App.config 文件中复制。复制和粘贴通常是我使用的,但可能有更聪明的方法。

这是一个关于实体框架和 MVC4 的小说明

首先,您需要安装 MySQL 数据和实体包。我通常通过 nuget 来做这些,只是为了让事情变得更容易。听起来你已经这样做了,但我把它放在这里只是为了完成。如果您使用的是单独的库。在该库上使用 NuGet。在构建库和 MVC 项目时,应将适当的 dll 复制到 bin 目录中。

接下来,您需要导入数据库。我发现最好的方法是预测你将要上多少节课。你说大约有 100 个表,所以我建议在你的模型文件夹中创建一个名为 DB 的新文件夹,这样它就不会与其他所有内容混淆。您需要右键单击这个新文件夹并添加一个新项目。选择 ADO.Net 数据模型。它应该创建一个 edmx 文件。从连接事物中选择 MySQL 连接器(按钮显示“更改...”或默认 MSSQL 连接器旁边的类似内容)。输入您的数据库信息,然后按照屏幕上的说明导入您的模型。

您现在应该有一个 DB 文件夹,其中包含一个文件,但是当使用 objectbrowser 或其他工具检查命名空间时,您应该会看到所有表类。

在此之后,您有几个选择:

  • 直接在您的视图中使用实体对象。这不需要任何额外的代码
  • 编写控制器将传递给视图的视图模型。这些都是基于实体框架对象

您的控制器实际上不应该关心它使用什么模型。下面是一个典型控制器的简短示例,它使用您在模型的 DB 文件夹中创建的上下文:

public class HomeController : MvcController
{
    private Model.DB.my_database_context context = new Model.DB.my_database_context();

    public ActionResult ShowSomething()
    {
        return this.View(context.users.First()); //assuming you have a table called user
    }
}

这是非常不可靠的(如果表中没有记录,则使用 First() 会引发异常),但如果您的 Views/Home 文件夹中有一个名为 ShowSomething.cshtml 的视图,它应该如下所示:

@model Model.DB.a_table

@Model.user_name

它所要做的就是显示用户名

现在,模型的有趣之处在于使用 Web API 控制器:

public class ValuesController : ApiController
{
    private Model.DB.my_database_context context = new Model.DB.my_database_context();

    public IEnumerable Get()
    {
        return context.values; //assuming you have a table called values
    }

    public value Get(string id)
    {
        return context.values.Where(v => v.id == id).FirstOrDefault();
    }
}

这些获取您的上下文并直接输出一个实体,该实体根据请求中的某些标头(Accept-Type 或类似的东西)被序列化为 XML、JSON 或其他内容。

于 2013-04-01T17:32:23.680 回答