Hallo,
Dein Repository ist falsch aufgebaut; Repositories kümmern sich nie selbst um das Öffnen und Verwalten von Datenbankverbindungen, sondern stellen lediglich eine Schnittstelle dar. Sie erhalten aber die aktive Verbindung über den Konstruktor.
Normalerweise hat ein Repository immer eine Basis, von der sie erbt; zudem sind Standardimplementierungen wie Get, GetMany, GetAll, Add, Delete, Save enthalten.
public abstract class RepositoryBase<T> where T : class
{
protected RepositoryBase( DbContext dbContext )
{
m_dataContext = dbContext;
m_dbset = DataContext.Set<T>();
}
// Hier die Standardimplementierunge, wie zB ein Single-Get
public T Get( Expression<Func<T, Boolean>> where )
{
return m_dbset.SingleOrDefault( where );
}
}
Ein spezifisches Repository erbt nun von diesem.
Es hat ebenso einen Konstruktor mit dem DbContext; gibts diesen aber an die Basis weiter. Zudme enthält es spezifische Methoden, die nur für diese Entity bzw. dessen spezifisches Repository gelten soll.
public class UserRepository : RepositoryBase<User>
{
public UserRepository( DbContext dbContext )
: base( dbContext )
{
}
// Spezifische Abfragen nur für dieses Repository
public User GetByID( Int64 id )
{
return Get( userEntity => userEntity.UserID.Equals( id ) );
}
}
Die Verwendung wäre dann zB:
public void AddMyUser(String userName, String hashedPassword, String eMail)
{
var user = new User
{
UserName = userName,
PasswordHash = hashedPassword,
EMail = eMail
};
using( var dbContext = DatabaseConnectionFactory.SingleConnection )
{
var userRepository = new UserRepository ( dbContext );
userRepository.Add(user);
userRepository.Save();
}
}
Das Problem das Du hast ist nämlich, dass Du die Entity in einem anderen Kontext erstellst.
Du machst irgendwo zB ein
new User(); und willst dieses dann in einem ganz anderen Kontext hinzufügen und speichern - und das funktioniert nicht ohne weiteres.
Der Aufgbau Deiner Anwendung stimmt hier ganz einfach nicht.
GANZ WICHTIG:
Das Beispiel von Th69 ist leider Käse, da man zudem tunlichst ToList() hier vermeiden soll!!!
Repository in EF 4.1 korrekt einsetzen
Gründe dafür haben xxMUROxx und ich ausführlich genannt!
Auch ist die Aussage falsch, dass man den Context nur so kurz wie möglich verwenden soll.
Grund: wenn man für jedes Repository eine einzige Verbindung verwendet, muss man ständig die Entity vom Kontext A in Kontext B detachen und attachen; das ist absolut unnötig und überhaupt nicht realitätsnah - man hat schließlich zwischen den Entities durchaus Relationen.
Man kann alles in ein using - wie in meinem Beispiel - packen, und mehrere Repositories innerhalb diesem damit versorgen.
Grüße