长期倾听者,第一次来访者。
我可能对此采取了错误的方法,所以任何帮助都会很棒。
我正在使用 C#、MVC 4、Code First、Entity Framework 4.3 和 Razor。
我正在尝试将 EF 数据类和一些方法拆分到一个单独的类项目中,以便它们通常可以被多个其他项目引用。我创建了这个简化示例来尽可能多地突出问题。
所以在一个类项目中我有:
public MyGeneric(string name)
{
ID = Guid.NewGuid();
Name = name;
}
public Guid ID { get; set; }
public string Name { get; set; }
public void AddThis(MyGeneric obj)
{
using (var db = Activator.CreateInstance<myDbContext>())
{
var myOthers = from mo in db.MyOther
where mo.OtherID == obj.ID
select mo;
myOthers.ForEach(mo => db.MyOther.Add(mo));
db.SaveChanges();
}
}
然后我可以在主项目中引用它,例如:
public class SampleInherit : MyGeneric
{
public SampleInherit(string newName, string secName)
: base(newName)
{
SecName = secName;
}
public string SecName { get; set; }
public void DoSomething(SampleInherit obj)
{
base.AddThis(obj);
// do other stuff
}
}
我想做的是将几个类及其方法通用化(这是一个词吗?)到一个单独的副项目中。该副项目将提供基类,这些基类将(按所需顺序):
- 使用 EF DbContext 创建/访问数据库,
- 允许添加更多属性,
- 提供影响基础数据的方法/程序,
- 更适合主要项目的重命名。
现在,如果我只是将基类继承到主项目中的类中,除了基类引用 myDbContext 和 LINQ 语句中的实体对象引用外,它都可以正常工作。
你能延迟绑定(bind) DataContext 还是我把自己画到一个角落里了?
为您能提供的所有帮助干杯。
最佳答案
我认为您要做的是实现 IRepository 模式。基本上你想要做的是创建一个包含你的实体和你的 IRepository 的类项目。从那里,您可以通过创建 Repository 类来创建 IRepository 的具体实现。您使用业务逻辑层通过 IRepository 访问存储库。并在那里访问您的数据。
public interface IRepository<T>
{
IQueryable<T> Fetch();
bool Insert(T entity);
bool Update(T entity);
}
然后创建你的仓库
public class MyRepository<TContext> : IRepository<EntityType> where TContext: DbContext, new()
{
private TContext context;
public MyRepository(TContext context)
{
this.context = context;
}
public IQueryable<T> Fetch()
{
return context.EntityTypes;
}
// Insert and update logic
}
最后创建你的业务逻辑
public class BusinessLogic
{
private IRepository<EntityType> repository;
public BusinessLogic(IRepository<EntityType> repository)
{
this.repository = repository;
}
public void Add(EntityType obj)
{
bool isNew = // check if new
if(isNew)
{
this.repository.Insert (obj)
}
else
{
this.repository.Update(obj);
}
}
}
然后调用你的业务逻辑
IRepository<EntityType> repository = new MyRepository<MyDbContext>(new MyDbContext());
BusinessLogic service = new BusinessLogic(repository);
service.Add(new EntityType());
我认为您不需要数据上下文的后期绑定(bind),出于性能考虑,最好使用泛型(如上例所示)。此外,使用此方法,您可以实例化一个数据上下文并将其传递给您的业务服务,以便 Entity Framework 可以跟踪您的实体,而不是为每次调用 AddThis 实例化一个新的数据上下文。加上这个模式,你可以做各种很酷的事情,比如使用像 ninject 这样的 IOC 容器为你创建这些业务服务,并使用 Mocks 为你的代码创建单元测试而不必访问数据库(通过模拟你的存储库).
关于c# - MVC 4 后期绑定(bind) DataContext 实体 LINQ 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11407729/