エンティティ フレームワーク 4.1 コードの最初のアプローチを使用して、別のレイヤーで新しい Web を作成します。
モデルレイヤーでは、クラスモデルを定義します
データレイヤーで、リポジトリクラスを定義します
データベース層では、リポジトリ クラスを実装します。コンテキストを作成し、自分のテーブルをカスタマイズするために DbContext を実装しました。
最後に、レイヤーの参照を Web サイト (プレゼンテーション レイヤー) に追加します。Web サイトを実行した後、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" />
接続文字列が間違っていますか? どうすれば修正できますか?