实体框架5(MySQL)作为现有MVC4解决方案的项目(类库)

时间:2013-03-27 08:00:55

标签: mysql asp.net-mvc entity-framework asp.net-mvc-4

我开始研究我的第一个EF项目。

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

这看起来如何: http://shrani.si/f/3/Xh/32C70yts/ef5.jpg

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

只要我使用那些类(db表)一切正常......我可以创建新的Controller ...编辑数据,写入Db ......

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

当然可以创建空的Controler。

我没有在DB或Model上找到太多东西(只有真正的基础帮助),大多数信息都在Code first aproach上。

我的Db最后应该有大约100个表...如果那意味着EF中的任何东西。

1 个答案:

答案 0 :(得分:1)

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

我不太明白你的错误,但你的句子“当我试着写我自己的模特课......”让我想到以下几点:

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

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

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

以下是使用Entity Framework和MVC4

的小指令

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

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

您现在应该有一个包含一个文件的DB文件夹,但是在使用objectbrowser检查命名空间时,您应该看到所有的表类。

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

  • 直接在视图中使用实体对象。这不需要任何额外的代码
  • 编写Controller将传递给视图的ViewModel。这些基于实体框架对象

您的控制器实际上不应该关心它使用的是什么型号。下面是典型控制器使用您在模型中的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的视图,它应如下所示: / p>

@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();
    }
}

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