Thanks Markus, this helps a lot. As you mentioned "With the session per request, all is fine. If you dion't use any TransactionScope inside the SessionScope, the latter uses an implicit transaction that spans the whole scope and is rolled back on errors"
this is all i need. I use session scope inside the domain model, i just dont expose this to the client to use. My goal is to not have the client worry or know about what is in a transaction, rather i will handle it inside the domain code. I am building more of an API, so I want the API to be responsible for knowing how to persist everything. But you answered my question fully, I am glad to learn i dont even have to do anything, that it is all built in. Thanks. On Jun 17, 12:02 pm, Markus Zywitza <[email protected]> wrote: > With the session per request, all is fine. If you dion't use any > TransactionScope inside the SessionScope, the latter uses an implicit > transaction that spans the whole scope and is rolled back on errors. > I thought that you want to work completely without scopes in the client > code, which then disallows lazy loading. > > -Markus > > 2009/6/17 csharp <[email protected]> > > > > > > > Makes sense. I am using castles http module for 1 session per > > request. > > > I thought many transaction scopes could reside in 1 session scope, > > thus I didnt think the above code would cause a problem. > > > On Jun 17, 10:21 am, Markus Zywitza <[email protected]> wrote: > > > For lazy loading, there must be a session that spans the whole lifetime > > of > > > teh object. If you don't use a SessionScope, a session will be created > > for > > > just the initial FindXXX()-call. That call creates proxies for the lazy > > > collections, that reference the session that loaded the original object. > > If > > > you now access those collections they try to load the collection, but the > > > session they refer to is already disposed. > > > > As a result, lazy loading must be disabled without session scopes. > > > -Markus > > > 2009/6/17 csharp <[email protected]> > > > > > Can you explain what you mean when you say lazy loading will not work > > > > with the code above? > > > > > On Jun 17, 12:27 am, Markus Zywitza <[email protected]> wrote: > > > > > Sure, you can. But it will backfire. First, you won't be able to load > > > > > anything lazily which might result in loading the whole DB with a > > simple > > > > > Entity.FindAll(). > > > > > Second, the scope of transactions is dictated by the business logic. > > You > > > > > can't even model a simple debit-credit-exampe with this approach. > > > > > > -Markus > > > > > > 2009/6/17 csharp <[email protected]> > > > > > > > Actually, 1 last question. > > > > > > > I dont expose persistence concerns to anything outside my objects. > > > > > > internally can I get this to work with something like this: > > > > > > > public override void Save() > > > > > > { > > > > > > using (TransactionScope trans = new TransactionScope()) > > > > > > { > > > > > > try > > > > > > { > > > > > > base.Save(); > > > > > > trans.VoteCommit(); > > > > > > } > > > > > > catch > > > > > > { > > > > > > trans.VoteRollBack(); > > > > > > throw; > > > > > > } > > > > > > } > > > > > > } > > > > > > > On Jun 16, 4:38 am, Markus Zywitza <[email protected]> > > wrote: > > > > > > > No, if you want the the cascade to be performed in a transaction > > you > > > > need > > > > > > to > > > > > > > put a scope around the code that calls Save(). > > > > > > > > -Markus > > > > > > > 2009/6/16 csharp <[email protected]> > > > > > > > > > Thanks Markus. > > > > > > > > > I am using it as a named parameter on an attribute, such as : > > > > > > > > > [BelongsTo( > > > > > > > > Column = "ColumnName", > > > > > > > > Type = typeof(TypeName), > > > > > > > > Fetch = FetchEnum.Join, > > > > > > > > Cascade = CascadeEnum.SaveUpdate, > > > > > > > > NotNull = true)] > > > > > > > > > Doing it this way, I thought, alleviated the need for me to use > > a > > > > > > > > session scope or transaction scope. If the cascade is > > performed > > > > > > > > automatically since it is declared in the attribute, my > > question is > > > > > > > > does it get performed inside a transaction or not? > > > > > > > > > Or are you saying i must override Save to put the Save method > > > > inside a > > > > > > > > transaction to be sure? > > > > > > > > > Thanks. > > > > > > > > > On Jun 15, 9:31 am, Markus Zywitza <[email protected]> > > > > wrote: > > > > > > > > > It uses the current session's transaction context: If you use > > > > > > > > SessionScope > > > > > > > > > or TransactionScope around your code, it is called within the > > > > > > > > transactions > > > > > > > > > provided by these scopes. If you call AR naked, there is no > > > > > > transaction > > > > > > > > > around the call. > > > > > > > > > > -Markus > > > > > > > > > > 2009/6/14 csharp <[email protected]> > > > > > > > > > > > If I specify a Cascade, such as CascadeEnum.SaveUpdate, is > > the > > > > > > save/ > > > > > > > > > > update performed inside a transaction? If not, is there a > > way > > > > to > > > > > > > > > > specify that it should be? > > > > > > > > > > > Thanks. > > > > > > > > > > Jason- Hide quoted text - > > > > > > > > > > - Show quoted text -- Hide quoted text - > > > > > > > > - Show quoted text -- Hide quoted text - > > > > > > - Show quoted text -- Hide quoted text - > > > > - Show quoted text -- Hide quoted text - > > - Show quoted text - --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Castle Project Users" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/castle-project-users?hl=en -~----------~----~----~----~------~----~------~--~---
