实体框架无法通过简单的POCO创建数据库

时间:2018-08-17 15:44:19

标签: entity-framework

我试图首先使用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; }
    }
}

这一行代码,当我运行应用程序时,出现此错误

enter image description here

我以为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(); 语句。

在这里,代码通过得很好,没有错误:

enter image description here

然后在

中创建数据库

c:\ Users \ myusername \ EF6Demo.MyContext.mdf c:\ Users \ myusername \ EF6Demo.MyContext_log.ldf

所以,每个说我必须插入的人都是错的。

唯一棘手的部分是不在数据库的默认位置c:\ myusername \文件夹中,而是在连接字符串中定义的位置中创建数据库。

那是行不通的,请参见上面的异常。

为什么我的连接字符串中的 Initial Catalog = | DataDirectory | MyDatabase 会导致此问题?

2 个答案:

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

`