verwendetes Datenbanksystem: SQLite, FluentNHibernate
Guten Morgen Leute,
Mich wuerde interessieren ob Repository korrekt aufgebaut ist, da ich nicht weiss ob ich ISession oder doch lieber ISessionFactory unterbringen sollte um auf die Datenbank zuzugreifen.
Ausserdem bin ich mir nicht sicher ob es z.B bei der Methode Retrieve performant ist sich die ganze Liste zu holen und dann mit linq nach id == x.Id abzufragen.
Gibt es da einen bessern weg ? Wie ich ein delete mache hab ich noch gar nicht rausgefunden.
class SimpleStockRepository : ISimpleStockRepository
{
private readonly ISession _session;
public SimpleStockRepository(ISession session)
{
_session = session;
}
public IQueryable<SimpleStock> RetrieveAll()
{
IQueryable<SimpleStock> simpleStockList;
using (var transaction = _session.BeginTransaction())
{
simpleStockList = _session.CreateCriteria(typeof(SimpleStock)).List<SimpleStock>().AsQueryable();
}
return simpleStockList;
}
public SimpleStock Retrieve(int id)
{
throw new NotImplementedException();
}
public void Save(SimpleStock simpleStock)
{
throw new NotImplementedException();
}
public void Delete(SimpleStock simpleStock)
{
throw new NotImplementedException();
}
}
Hallo macFish,
Für eine Id-Abfrage gibt es viel besser Methoden in NHibernate:
NHibernate.ISession s = ...;
return s.Get<T>(id);
// oder
return s.Load<T>(id);
(Eine von beiden Macht garkeinen SQL wenn das Objekt schon in der Session geladen ist, das andere fragt noch mal in der DB an.)
Gruß
Juy Juka
hallo Juy Juka,
danke schon mal dafuer !!
delete ist ja auch easy...
bleiben noch 1 frage,
die ich glaub ich auch
schon auf google gefunden habe.
Hi,
wir arbeiten nur mit ISession und übergeben diese aus dem Datacontext.
Die ISessionFactory ist in einer anderen Schicht anzusiedeln.
Grüße
hallo nochmal,
waere das eine elegante moeglichkeit ??
http://russelleast.wordpress.com/2008/09/23/implementing-fluent-nhibernate/
Hab das jetzt so geloest. Moechte das Projekt so sauber wie moeglich erstellen.
public class SessionFactory
{
public static string DatabaseName { get; private set; }
private static ISessionFactory CreateSessionFactory(string databaseName)
{
DatabaseName = databaseName;
return Fluently.Configure()
.Database(
SQLiteConfiguration.Standard
.UsingFile(DatabaseName)
)
.Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<SessionFactory>())
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
private static void BuildSchema(Configuration config)
{
if (File.Exists(DatabaseName))
File.Delete(DatabaseName);
new SchemaExport(config)
.Create(false, true);
}
}
Ola,
ich würde mir die Session zurückgeben lassen :
public static class Database
{
private static ISessionFactory _sessionFactory;
private static void CreateSessionFactory()
{
_sessionFactory =
Fluently.Configure()
.Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005.ConnectionString(""))
.ProxyFactoryFactory(typeof(NHibernate.ByteCode.Castle.ProxyFactory))
.Mappings(m =>
m.AutoMappings
.Add(AutoMap.AssemblyOf<LogEntity>)
)
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
private static void BuildSchema(Configuration cfg)
{
new SchemaExport(cfg).Create(false,true);
}
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
CreateSessionFactory();
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}