我想用EF创建一个新的MVC项目,以使用数据库优先方法。
所以我使用向导在Visual Studio 2015中创建了一个新的MVC 5.2.3项目,该向导创建了默认的帐户和管理用户模型,控制器和视图。
连接字符串是那种
Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-MyProject-20161112112119.mdf;Initial Catalog=aspnet-MyProject-20161112112119;Integrated Security=True" providerName="System.Data.SqlClient
我在这里有一些问题:
我项目的App_Data
文件夹中没有mdf文件,所以我不知道数据库到底在哪里。
我猜应用程序默认使用Code first方法,所以很明显我想改变它。一个想法是从设置中创建的内部项目db中复制表,并将它们添加到我将用于db first方法的新数据库中。但我无法找到现有的应用数据库(参见第1点)。
我可以通过Management Studio连接到上面的connstring((LocalDb)\MSSQLLocalDB
)中使用的服务器,但它根本没有数据库,甚至没有conn字符串中提到的数据库。该文件不在App_Data
文件夹
所以我使用Sql Server Management Studio在我的MyProjectDb
服务器中创建了一个全新的数据库localhost
,目的是将其用于db first方法。
我在我的解决方案中创建了一个新项目MyProject.Database
,以使用新创建的数据库MyProjectDb
。
我检查过,可以看到MyProject.Database
项目属性中的数据库字符串的connstring数据源为(LocalDb)/ProjectsV13
而不是localhost
。问题是为什么这种奇怪的来源而不是我的localhost
?以及如何强制新的db项目在localhost
服务器中创建数据库?
接下来,我修改了数据库项目(Debug选项卡)的属性,以便在连接字符串localhost
中用作数据源和我创建的新数据库MyProjectDb
。
现在我右键单击我的数据库项目MyProject.Database
:添加>新项目>表。我创建了这张桌子。
我现在可以在Projects-MyProject
文件夹下的SQL Server对象资源管理器中看到数据库了,我可以看到我在SQL Server中的MyProjectDb
服务器下创建的数据库localhost
管理工作室。前者有我创建的表,后者在表下没有它(我当然刷新了表)。这很奇怪,我很困惑他们是否实际上是相同的数据库,或者不知何故VS复制数据库而不是使用我创建的数据库?
我在解决方案资源管理器中右键单击我的Web项目:添加>新项目>数据> ADO.NET实体数据模型,我给出了名称,在下一个屏幕上我选择了EF Designer from database
选项。我点击下一步,进入我可以创建New connection
的屏幕。我点击这个,我可以从列表中选择的唯一服务器是NICKO-PC
服务器。 (请记住:我在VS中创建的db项目默认为(LocalDb)?ProjectsV13
服务器)如果我尝试插入localhost
或其他任何内容,它确实会更改回NICKO-PC
,但我想它无论如何都是相同的作为localhost
服务器cos,当我展开可用数据库时,我的MyProjectDb
数据库在列表中。所以我选择它然后去。
我看到了Choose Your Database Objects And Settings
个屏幕。现在我无法看到我使用MyProject.Database
项目创建的表格。没有表可供选择更精确。显然,我无法在我的应用程序中创建任何数据库实体。
我被困住了。
我希望我对事件的描述不会引起混淆。
任何人都可以帮助我做我想做的事吗?
我不知道为什么Web项目在某个奇怪的(LocalDb)\MSSQLLocalDB
服务器和数据库项目上使用db文件而不是在(LocalDb)/ProjectsV13
下创建它?
如何创建自己的新数据库并将其用于Web应用程序和数据库项目,然后根据db first方法创建实体?
如何在数据实体向导中获取表和其他对象我想在我的应用程序中创建模型实体?
这基本上就是我所需要的。
请让我知道你是如何使用Db First方法创建一个项目的,因为我没有在任何地方使用VS工作室向导。
谢谢
*编辑*
我的DbContext类非常简单,由我与用户模型一起安装的MVC项目创建:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
它指向默认的conn字符串,因为您可以看到我更改为连接到新创建的数据库MyProjectDb
。
答案 0 :(得分:0)
实际运行网站后,和会点击需要数据库访问权限的内容。实体框架应该创建数据库。我想你可能很快就会偏离道路。
无论如何,默认情况下,默认代码是代码,或者更合适:默认情况下是创建新数据库。旧的“模型优先”和“数据库优先”方法已被弃用,虽然您现在仍然可以使用 ,但不建议这样做,特别是在构建新应用时,您需要长时间支持术语。也就是说,“代码优先”,尽管名称,实际上可以与现有数据库一起使用或创建一个新数据库。您只需稍微改变您的上下文以使用现有数据库:
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext() : base("ConnectionStringName")
{
Database.SetInitializer<ApplicationDbContext>(null);
}
...
}
然后,编辑Web.config并将连接字符串添加到要连接的现有数据库。确保您在那里提供的名称与上面代码中“ConnectionStringName”的位置匹配。