项目启动时未创建数据库

时间:2017-02-14 19:36:33

标签: c# entity-framework

刚开始学习EF和数据库,所以我一直在关注这个简短的教程:http://www.entityframeworktutorial.net/code-first/simple-code-first-example.aspx

我使用他的示例,但是当我尝试使用我自己的类等时,没有创建数据库(或者至少我无法在对象资源管理器中找到它),我希望你能够告诉我为什么?

我知道我没有在上下文类的base()部分声明一个连接字符串,但是在教程的例子中他也没有,所以这不应该是问题我猜测?在此先感谢:)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShopEntity
{
    class Product
    {
        public int ProductId { get; set; }
        public int Price { get; set; }
        public string ProductName { get; set; }


    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ShopEntity
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            using (var ctx = new ShopContext())
            {
                User adminUser = new User()
                {
                    Address = "Skejby Vænge 96A",
                    EMailAddress = "anderskloborg@gmail.com",
                    IsAdmin = 1,
                    PassWord = "12345678",
                    UserName = "Anders1234"
                };
                //Product Apple = new Product() { Price = 2, ProductName = "Apple" };
                //Product Melon = new Product() { Price = 10, ProductName = "Melon" };
                //Product Beef = new Product() { Price = 40, ProductName = "Beef" };
                ctx.Users.Add(adminUser);
                //ctx.Products.Add(Apple);
                //ctx.Products.Add(Melon);
                //ctx.Products.Add(Beef);
                ctx.SaveChanges();

            }




                Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShopEntity
{
    class ShopContext: DbContext
    {
        public ShopContext() : base()
        {

        }

        public DbSet<User> Users { get; set; }

        public DbSet<Product> Products { get; set; }


    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShopEntity
{
    class User
    {

        public int UserId { get; set; }

        [MaxLength(20)]
        public string UserName { get; set; }

        [MaxLength(20)]
        public string PassWord { get; set; }
        public string EMailAddress { get; set; }

        [MaxLength(50)]
        public string Address { get; set; }
        public byte IsAdmin { get; set; }

    }
}

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

3 个答案:

答案 0 :(得分:1)

我不确定为什么在示例中他没有将连接字符串传递给基础构造函数,但需要告诉DbContext要连接的数据库。以下是您正在使用的示例中的链接。

http://www.entityframeworktutorial.net/EntityFramework4.3/dbcontext-vs-objectcontext.aspx

答案 1 :(得分:1)

您的应用中的任何位置都没有定义连接字符串。您需要在app.config中定义连接,然后在您的上下文类中引用它。

<强>的app.config

您需要根据数据库名称和身份验证选项修改连接字符串以满足您的需求。

   <configuration>
     <connectionStrings>
      <add name="myConnection" connectionString="SERVER=myServer;Integrated Security=SSPI;Initial Catalog=myDB"/>
     </connectionString>
    </configuration>

数据库上下文

app.config中的连接名称需要传递到base DbContext`类定义中。

class ShopContext: DbContext
        {
            public ShopContext() : base("myConnection")
            {

            }

            public DbSet<User> Users { get; set; }
            public DbSet<Product> Products { get; set; }

        }

答案 2 :(得分:1)

数据库创建正常,但在这样的情况下,没有人从未提及的最愚蠢的事情是数据库是在Windows配置文件目录/文件夹中创建的。此示例使用默认位置,在某种Entity Framework默认和不可见的连接字符串(工厂函数)中。看一下c:\ users [yourmachineloginname],观察一下数据库前缀 ConsoleApplication ,或者你的情况下带有前缀 ShopEntity 。为了将此数据库放在其他位置,您需要创建一个特定的连接字符串。

要制作特定连接字符串,请执行以下操作:

0)删除在Windows配置文件文件夹中创建的数据库文件

1)在项目文件夹中,创建一个名为App_Data

的文件夹

2)将此连接字符串放入app.config文件中:

<connectionStrings>
    <add name="myConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFileName=C:\projects\sabemos\ConsoleApplication1\ConsoleApplication1\App_Data\DatabaseFileName.mdf;Integrated Security=True;MultipleActiveResultSets=True" />
  </connectionStrings>

4)记得将连接字符串中的路径(c:\ projects ...)更改为指向您的数据库文件的路径

5)确保连接字符串名称与您在DbContext基本初始化中使用的名称相对应

到目前为止,你应该在项目文件夹的App_Data文件夹中找到数据库 pop