如何从子项目初始化DbContext?

时间:2016-03-01 17:44:25

标签: c# entity-framework generic-programming

我有两个网络项目,第一个是框架,其他是购物,两个项目都是WebForm,我正在使用Entity Framework。 我想在框架项目中实现GenericRepository,然后在购物项目中使用它。 框架项目有自己的DbContext名为FrameworkContext,购物项目有自己的DbContext,它扩展FrameworkContext并命名为AppContext

public class FrameworkContext : DbContext
{
    public FrameworkContext() : base("name=AppContext")
    {
    }
}

public class AppContext : FrameworkContext
{
    public AppContext()
    {
    }

    public DbSet<Car> cars { get; set; }
    public DbSet<Plaque> plaques { get; set; }
}


public class GenericRepository<T, Key> : IGenericRepository<T, Key> where T : BaseEntity
{
    private FrameworkContext _dbContext;

    public GenericRepository()
    {
    }

    public FrameworkContext context
    {
        get { return _dbContext; }
        set { _dbContext = value; }
    }

    public IEnumerable<T> getAll()
    {
        return _dbContext.Set<T>().ToList();
    }
}

购物项目的web.config

<?xml version="1.0" encoding="utf-8"?>

<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <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>
  <connectionStrings>
    <add name="AppContext" providerName="System.Data.SqlClient" connectionString="Server=ASUS-PC\SQLEXPRESS;Database=testFramework;Integrated Security=True;" />
  </connectionStrings>
</configuration>

现在,我添加框架项目作为购物项目的参考。当我调用getAll() Repository方法时,会抛出以下异常:

enter image description here

更新

我用@ octavioccl的解决方案来解决我的问题。现在发生另一个异常: enter image description here

这些是我的BaseEntity班级和Car班级:

namespace framework.Model
{
    public abstract class BaseEntity
    {
        [Key]
        public Int64 id { get; set; }

        public string createdDate { get; set; }
    }
}


namespace shopping.model
{
    public class Car : BaseEntity
    {
        public string name { get; set; }
        public int year { get; set; }

        public virtual List<Plaque> plaques { get; set; }
    }
}

1 个答案:

答案 0 :(得分:1)

我没有看到您在dbContext类上初始化GenericRepository变量,尝试在构造函数中初始化此变量:

 public GenericRepository()
{
 _dbContext=new FrameworkContext();
}

更新

有很多方法可以解决您的第二个异常,问题是因为您的上下文不了解您的实体:

解决方案可以在您的上下文中声明属性,如下所示:

public DbSet<Car> Cars{get;set;}

或者使用Fluent Api,例如,覆盖OnModelCreating方法并执行以下操作:

 modelBuilder.Entity<Car>().HasKey(c=>c.Id);

但最好的方法是为每个实体创建一个映射类:

public class CarMap : EntityTypeConfiguration<Car>
{
    public CarMap()
    {
        // Primary Key
        this.HasKey(t => t.Id);
    }
}

稍后您只需要在OnModelCreating方法中执行此操作即可发现所有映射:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
        modelBuilder.Configurations.AddFromAssembly(typeof(FrameworkContext).Assembly);// set here the asembly where there are all your mapping classes.
 }