我试图首先使用EF代码创建一个非常简单的数据库。
我定义了此连接字符串
<add name="MyContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=MyDatabase;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\MyDatabase.mdf" providerName="System.Data.SqlClient" />
创建了这些模型
namespace EF6Demo
{
public class Contact
{
public Contact()
{
this.Jobs = new HashSet<Job>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Job> Jobs { get; set; }
}
public class Job
{
public int Id { get; set; }
public string Name { get; set; }
}
}
创建了此上下文类
namespace EF6Demo
{
public class MyContext : DbContext
{
public DbSet<Contact> Contacts { get; set; }
public DbSet<Job> Jobs { get; set; }
}
}
这一行代码,当我运行应用程序时,出现此错误
我以为EF应该根据我的类,上下文和连接字符串创建此数据库。怎么了?
此外,在此MSDN文章中:https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/workflows/new-database
他们使用列表作为导航属性,而在所有教程中,他们使用ICollection。那是文档中的缺陷吗?
更新:
如果我只是从App.Config中删除connectionString,那么一切正常,一旦代码到达,数据库已创建
var contact = ctx.Contacts.ToList(); 语句。
在这里,代码通过得很好,没有错误:
然后在
中创建数据库c:\ Users \ myusername \ EF6Demo.MyContext.mdf c:\ Users \ myusername \ EF6Demo.MyContext_log.ldf
所以,每个说我必须插入的人都是错的。
唯一棘手的部分是不在数据库的默认位置c:\ myusername \文件夹中,而是在连接字符串中定义的位置中创建数据库。
那是行不通的,请参见上面的异常。
为什么我的连接字符串中的 Initial Catalog = | DataDirectory | MyDatabase 会导致此问题?
答案 0 :(得分:0)
在创建迁移然后更新数据库之后,实体框架将创建表。您必须先执行此操作,然后才能执行程序。
如果您正在运行实体框架核心,请在根项目文件夹中的powershell或cmd提示符下运行以下命令。
from PyQt4 import QtCore, QtGui
class HorizontalHeader(QtGui.QHeaderView):
def __init__(self, parent=None):
super(HorizontalHeader, self).__init__(QtCore.Qt.Horizontal, parent)
self.button = QtGui.QToolButton(self, text="x")
self.sectionResized.connect(self.handleSectionResized)
def handleSectionResized(self):
last_ix = self.count() - 1
pos = QtCore.QPoint(self.sectionViewportPosition(last_ix) + self.sectionSize(last_ix) , 0)
self.button.move(pos)
def showEvent(self, event):
self.handleSectionResized()
super(HorizontalHeader, self).showEvent(event)
class TableView(QtGui.QTableView):
def __init__(self, *args, **kwargs):
super(TableView, self).__init__(*args, **kwargs)
header = HorizontalHeader(self)
header.button.clicked.connect(self.deleteLater)
self.setHorizontalHeader(header)
QtGui.qApp.focusChanged.connect(self.onFocusChanged)
def onFocusChanged(self, old, new):
if new == self:
self.deleteLater()
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
scrollArea = QtGui.QScrollArea()
scrollArea.setWidgetResizable(True)
widget = QtGui.QWidget()
scrollArea.setWidget(widget)
lay = QtGui.QVBoxLayout(widget)
for i in range(10):
w = TableView()
model = QtGui.QStandardItemModel(4, 2, w)
w.setModel(model)
lay.addWidget(w)
scrollArea.show()
sys.exit(app.exec_())
生成迁移并运行update命令后,该表应该不包含数据,并且不会出现错误。
答案 1 :(得分:0)
看起来您正在尝试提取联系人列表,而从未将其添加到数据库中。
尝试:
Contact contact = new Contact();
contact.Name = "new name";
using (var ctx = new MyContext())
{
ctx.Contact.Add(contact);
ctx.SaveChanges();
}
`