I\'m creating my first N-Tier MVC application and I\'ve run into a road block with how to manage multiple DbContexts with my database first approach.
I
You could create a wrapper that is generic repository across DbContexts (and utilizes the underlying ObjectContext to support this).
Here is an example I've used in the past (which also decouples your code from any direct dependency on Entity Framework).
// Make your DbContext inherit from this. This goes in your Unit of Work.
public interface IEntitySetProvider : IDisposable
{
IEntitySet CreateEntitySet();
}
// This is your adapted DBContext
public class MyDbContext1 : DbContext, IEntitySetProvider
{
public IEntitySet CreateEntitySet()
{
return new EntitySet(((IObjectContextAdapter)this).CreateObjectSet());
}
.
.
.
}
///
/// A wrapper for an IQueryable that exposes AddNew and Attach methods.
///
///
public interface IEntitySet : IQueryable
{
///
/// Attaches the specified value and considers it new.
///
/// The value.
void AddNew(T value);
///
/// Attaches the specified value and considers it modified.
///
/// The value.
void Attach(T value);
}
///
/// An IEntitySet for Entity Framework.
///
///
internal class EntitySet : IEntitySet where T : class
{
private readonly ObjectSet _objectSet;
public EntitySet(ObjectSet objectSet)
{
_objectSet = objectSet;
}
#region IEntitySet Members
public void AddNew(T value)
{
_objectSet.AddObject(value);
}
public void Attach(T value)
{
_objectSet.Attach(value);
_objectSet.Context.ObjectStateManager.ChangeObjectState(value, EntityState.Modified);
}
public IEnumerator GetEnumerator()
{
return ((IQueryable) _objectSet).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IQueryable) _objectSet).GetEnumerator();
}
public Type ElementType
{
get { return ((IQueryable) _objectSet).ElementType; }
}
public Expression Expression
{
get { return ((IQueryable) _objectSet).Expression; }
}
public IQueryProvider Provider
{
get { return ((IQueryable) _objectSet).Provider; }
}
#endregion
}