【问题标题】:EF 4.1 using code first do not create new databaseEF 4.1 使用代码首先不要创建新数据库
【发布时间】:2012-12-27 16:21:51
【问题描述】:

我使用具有独立层的实体框架 4.1 代码优先方法创建了一个新网站:

在模型层,我定义类模型

在数据层,我定义了存储库类

在数据库层,我实现了存储库类。创建上下文,我实现了 DbContext 来自定义我自己的表。

最后,我将图层的引用添加到网站(表示层)。运行我的网站后,EF 4.1 不在 App_Data 文件夹中创建数据库。我想知道我做错了哪些步骤。请查看我的代码并给我一些建议。提前致谢!

我只是添加了我认为其中包含错误的类的代码。模型层中的其他类模型和数据层中的类存储库与错误无关。所以这里就不写了。

web.config:

<add name="ApplicationServices" connectionString="Data Source=DESKTOP\Neven;Initial Catalog=aspnetdb;Integrated Security=True" providerName="System.Data.SqlClient" />
      <add name="FashionShopData" connectionString="Data Source=|DataDirectory|FashionShopData.mdf;Initial Catalog=FashionShopData;Integrated Security=True" providerName="System.Data.SqlClient" />

在 Global.asax 中:

    protected void Application_Start()
        {

            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            ModelMetadataProviders.Current = new MetadataProvider();
            InitialDatabase();
        }

private static void InitialDatabase()
        {
            var repositoryInitializer = new RepositoryInitializer();
            repositoryInitializer.Initialize();
        }

在数据库 SQL 层中:

上下文

    using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using FashionShop.Data.Repositories;
using FashionShop.Models;

namespace FashipShop.Data.Sql
{

    public partial class FashionShopContext : DbContext, IUnitOfWork
    {
        /// <summary>
        /// This method sets up the database appropriately for the available model objects.
        /// This method only sets up the data tier.  
        /// Any shared or model level requirements (data validations, etc) are on the model objects themselves.
        /// </summary>
        /// <param name="modelBuilder">The model builder object for creating the data model.</param>
        public FashionShopContext()
        : base("name=FashionShopData")
    {

    }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

            SetupUserEntity(modelBuilder);

            SetupCategoryEntity(modelBuilder);

            SetupProductEntity(modelBuilder);

            SetupOrderEntity(modelBuilder);

        }

        private static void SetupUserEntity(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>().HasKey(r => r.UserId);
            modelBuilder.Entity<User>().Property(r => r.UserId).HasDatabaseGeneratedOption(
                DatabaseGeneratedOption.Identity);

            modelBuilder.Entity<User>().HasMany(o => o.Orders);

            modelBuilder.Entity<User>().Property(r => r.Email).IsRequired();
        }

        private static void SetupCategoryEntity(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Category>().HasKey(c => c.CateId);
            modelBuilder.Entity<Category>().Property(c => c.CateId).HasDatabaseGeneratedOption(
                DatabaseGeneratedOption.Identity);
            modelBuilder.Entity<Category>().Property(c => c.ParentId).IsOptional();
            modelBuilder.Entity<Category>().HasMany(p => p.Products);
        }

        private static void SetupProductEntity(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Product>().HasKey(p => p.ProductId);
            modelBuilder.Entity<Product>().Property(p => p.ProductId).HasDatabaseGeneratedOption(
                DatabaseGeneratedOption.Identity);

            modelBuilder.Entity<Product>().HasRequired(c => c.Category).WithRequiredPrincipal().WillCascadeOnDelete(true);
        }

        private static void SetupOrderEntity(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Order>().HasKey(o => o.OrderId);
            modelBuilder.Entity<Order>().Property(o => o.OrderId).HasDatabaseGeneratedOption(
                DatabaseGeneratedOption.Identity);
            modelBuilder.Entity<Order>().HasMany(p => p.Products).WithMany(o => o.Orders).Map(op =>
                                                                                                  {
                                                                                                      op.ToTable(
                                                                                                          "ProductOrder");
                                                                                                      op.MapLeftKey(
                                                                                                          "OrderId");
                                                                                                      op.MapRightKey(
                                                                                                          "ProductId");
                                                                                                  });
        }

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

        public DbSet<Category> Categories { get; set; }

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

        public DbSet<Order> ShoppingCarts { get; set; }

        void IUnitOfWork.SaveChanges()
        {
            base.SaveChanges();
        }
    }
}

存储库初始化代码:

    using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using FashionShop.Data.Repositories;

namespace FashipShop.Data.Sql
{
    public class RepositoryInitializer : IRepositoryInitializer
    {

        public RepositoryInitializer()
        {
            Database.DefaultConnectionFactory = new SqlConnectionFactory();
        }

        public void Initialize()
        {
            Database.SetInitializer(new CreateDatabaseIfNotExists<FashionShopContext>());
        }
    }
}

通用存储库:

    using System;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using FashionShop.Data.Repositories;


namespace FashipShop.Data.Sql.Repositories
{    
    public abstract class GenericRepository<T>: IGenericRepository<T> where T:class {
        protected IUnitOfWork UnitOfWork { get; set; }
        protected FashionShopContext Context { get { return (FashionShopContext)this.UnitOfWork; } }

        public GenericRepository(IUnitOfWork unitOfWork)
        {
            if (unitOfWork == null) throw new ArgumentNullException("unitOfWork");
            this.UnitOfWork = unitOfWork;
        }

        public virtual IQueryable<T> GetAll()
        {
            IQueryable<T> query  = Context.Set<T>();
            return query;
        }

        public IQueryable<T> FindBy(Expression<Func<T, bool>> predicate)
        {
            IQueryable<T> query = Context.Set<T>().Where(predicate);
            return query;
        }

        public virtual void Add(T entity)
        {
            Context.Set<T>().Add(entity);
            Context.SaveChanges();
        }

        public virtual void Delete(T entity)
        {
            Context.Set<T>().Remove(entity);
            Context.SaveChanges();
        }

        public virtual void Edit(T entity)
        {
            Context.Entry(entity).State = EntityState.Modified;
            Context.SaveChanges();
        }
    }



}

我发现了错误,因为我从来没有在我的表现层中使用代码所以EF没有初始化数据库,我需要添加

FashionShopContext context = new FashionShopContext(); 
context.Database.Initialize(true);

进入 Application_Start()。但是在我更改代码之后,还有另一个错误:

"A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server"

这是我使用的连接字符串:

<add name="FashionShopData" connectionString="Data Source=|DataDirectory|FashionShopData.mdf;Initial Catalog=FashionShopData;Integrated Security=True" providerName="System.Data.SqlClient" />

我的连接字符串错了吗?我该如何纠正它?

【问题讨论】:

  • 您是否打算将 FashionShop FashipShop 作为命名空间的开头?
  • 我的错误,我将更改我的代码并重试。但我认为这不是问题。因为我使用添加引用将所有图层添加到我的网站(表示层)

标签: c# .net asp.net-mvc-3 entity-framework ef-code-first


【解决方案1】:

试试..

<add name="ContextName" connectionString="Data Source=ServerName;Initial Catalog=DBCataloName;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework"
   providerName="System.Data.SqlClient" />

【讨论】:

    【解决方案2】:

    您的问题在于启动连接字符串,您在 DbContext 派生类上设置了该字符串。

    应该如下所示。

    public partial class FashionShopContext : DbContext, IUnitOfWork
    {
    
       public static string ConnectionString { get; set; }
    
       public FashionShopContext() : base(ConnectionString ?? "FashionShopData")
        {
    
        }
    }
    

    Global.asax

    protected void Application_Start()
    {
    FashionShopContext.ConnectionString = ConfigurationManager.ConnectionStrings["FashionShopData"].ConnectionString;
    }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 2013-10-11
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多