Visual Studio凭空创建一个新数据库来存储我的数据。这是我的DbContext:
public class LinkedDataContext : DbContext
{
public DbSet<LinkedData> LinkedData { get; set; }
}
没有错误被抛出,我最终得到的另一个数据库只能通过SQL Server对象资源管理器看到,这与我最初创建的数据库不同,后者是屏幕截图中的顶级数据库。
修改
我将MVC项目生成的整个帐户数据库迁移到MSSQL 2014服务器。我只是在那里添加了一个数据库并更改了连接字符串,然后自动用所需的表填充数据库。
所以我创建了自定义表,就像在本地数据库中一样。我删除了本地数据库,其他连接字符串和Controller。然后我重建我的项目并再次创建控制器。但VS / MVC / EF或其他任何人负责仍在为我的自定义数据创建一个本地数据库。
当我创建控制器时,它似乎在MSSQL SERVER 2014中找到了我的表,否则我会得到一个安全的对话框来本地存储sql文件。那么这里到底发生了什么?就像我说的那样,帐户功能就像魅力一样立即起作用。我在MSSQL中的自定义表将无法使用。
修改
所以我将DefaultConnectionFactory
中的Web.config
设置为我的MSSQL SERVER 2014,现在它在我的MSSQL SERVER中生成一个新的数据库。它似乎是命名空间,当我创建一个控制器时,我需要传递Model类和Context类的命名空间。
Model class: LinkedData (DataVisualization.Models)
Data context class: LinkedDataContext (DataVisualization.Models)
自动生成以保存我的自定义数据的数据库称为:DataVisualization.Model.LinkedDataContext
。
有没有人知道这里到底发生了什么?
答案 0 :(得分:0)
我相信它只是Web.config
中的连接字符串。从项目外部的现有数据库创建DbContext
时,Visual Studio会提示
您选择的连接使用不在的本地数据文件 当前的项目。您要将文件复制到项目中吗? 修改连接?
如果选择“是”,则会将数据库文件复制到项目中,将“构建操作”设置为“内容”,在连接字符串中设置对它的相对引用,并将其设置为在构建时复制到输出目录。
如果你修改connectionString
中的Web.config
指向正确的数据库,你应该设置(为了将来参考,当被问到是否要复制它时回答否,除非那是真的你想做什么 - 例如你用二进制文件分发的数据库文件。)
例如,请参阅下面列出的两个连接。如果您选择了是,则会看到类似ProjectContext
的内容,如果您选择了否,则会看到ExternalContext
之类的内容。
<connectionStrings>
<add name="ProjectContext" connectionString="data source=(LocalDB)\MSSQLLocalDB;attachdbfilename=|DataDirectory|\Database.mdf;integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
<add name="ExternalContext" connectionString="data source=(LocalDB)\MSSQLLocalDB;attachdbfilename=C:\Programming\.Net\DataVisualization\Data\DataVisualization\App_Data\Database.mdf;integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
请注意,connectionString
的实际语法在您的应用中可能会有所不同,具体取决于所使用的设置,但关键部分是|DataDirectory|
引用与正确的路径。路径是您需要修改的路径。
答案 1 :(得分:0)
简写解决方案是:
>>> import itertools
>>> my_string = 'this is is a string'
>>> " ".join([k for k, g in itertools.groupby(my_string.split())])
'this is a string'
我假设如果没有以上下文命名的连接,它将采用默认连接。原因是我没有得到错误,所以连接会没问题。然而,如果没有在public class LinkedDataContext : DbContext
{
public DbSet<LinkedData> LinkedData { get; set; }
public LinkedDataContext() : base("DefaultConnection")
{
}
}
中指定connectionString,它似乎只是接受了默认字符串的一部分,因为它确实找到了我的数据库并抛出了它的命名空间并且凭空创建了一个新的数据库。我可能是MVC的新手,但我发现这种荒谬的默认行为。所以我仍然不知道这背后的想法是什么。
除非你想为一个相当大的应用程序提供几百个连接字符串,否则唯一的方法就是调用父构造函数并在那里指定web.config
。具有讽刺意味的是,你必须“指定”默认行为。
与@tomtom告诉我的不同,在近10个小时内,我没有找到一个类似于我的场景。也许我不清楚,但在我的第一篇文章中,我确实指出了我采取的每一步。似乎没有必要使用MSSQL SERVER。
希望这有助于其他人。
答案 2 :(得分:-1)
标准行为。虽然很糟糕。每次点击“调试”按钮时,您的数据库模板都会复制到运行时,因此您始终可以使用新的数据库。像地狱一样痛苦。不知道其他人如何解决这个问题 - 我从不使用visual studio的这一面,我安装了一个sql server并手动创建我的数据库。确保我始终违背定义的副本。显然,VS无权在那里创建数据库;)
如果您懒得使用谷歌或网站搜索一点,您会发现大量类似的问题 - 这是人们经常陷入困境的标准问题,因为它完全不是他们所期望的。
(如果你问我,EF的整个数据库维护方面都会被破坏,包括几乎不能使用SQL Server最基本功能的“迁移”)。