我有两个网络项目,第一个是框架,其他是购物,两个项目都是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
方法时,会抛出以下异常:
更新
我用@ octavioccl的解决方案来解决我的问题。现在发生另一个异常:
这些是我的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; }
}
}
答案 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.
}