您的问题很难理解,但我假设您正在寻找一个将 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 或其他内容。