Laden...

Repository Klasse korrekt ? FluentNHibernate optimale abfragen erstellen

Erstellt von macFish vor 12 Jahren Letzter Beitrag vor 12 Jahren 941 Views
M
macFish Themenstarter:in
16 Beiträge seit 2011
vor 12 Jahren
Repository Klasse korrekt ? FluentNHibernate optimale abfragen erstellen

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();
        }
    }
2.187 Beiträge seit 2005
vor 12 Jahren

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

M
macFish Themenstarter:in
16 Beiträge seit 2011
vor 12 Jahren

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.

A
350 Beiträge seit 2010
vor 12 Jahren

Hi,
wir arbeiten nur mit ISession und übergeben diese aus dem Datacontext.
Die ISessionFactory ist in einer anderen Schicht anzusiedeln.

Grüße

M
macFish Themenstarter:in
16 Beiträge seit 2011
vor 12 Jahren

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);
        }
    }
A
350 Beiträge seit 2010
vor 12 Jahren

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();
}
}
M
macFish Themenstarter:in
16 Beiträge seit 2011
vor 12 Jahren

k thx