2012-12-27 35 views
1

我使用實體框架4.1代碼第一種方法,配有獨立圖層創建新的Web:EF 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" /> 

是我的連接字符串是錯誤的?我該如何糾正它?

+0

您是否打算將FashionShop _and_ FashipShop作爲命名空間的開始? – mcalex

+0

我的錯誤,我將改變我的代碼,然後再試一次。但我認爲這不是問題。因爲我使用添加引用將所有圖層添加到我的網站(表示層) – NevenHuynh

回答

1

嘗試..

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

謝謝soadyp,它的工作原理 – NevenHuynh

0

問題發起連接字符串,你對的DbContext派生類中設置的。

它應該如下所示。

public partial class FashionShopContext : DbContext, IUnitOfWork 
{ 

    public static string ConnectionString { get; set; } 

    public FashionShopContext() : base(ConnectionString ?? "FashionShopData") 
    { 

    } 
} 

全局。asax

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

我希望這對你有幫助。

+0

感謝Sampath,我修復了我的connectionString,它的工作原理 – NevenHuynh

相關問題