views:

215

answers:

0

Consider the following:

I have a high level component that deals with detached Linq to Sql entities. We'll call them Foo and Prop, where a single Foo may be associated with many Prop, but every Prop is always associated with exactly one Foo. So:

+------+ 1    0..n +------+
| Foo  |-----------| Prop |
+------+           +------+

Very simple, I hope you agree.

At a high level of abstraction in my application, it's important to me to be able to display Foo's, so I keep a cache of them, all nicely detached from their source DataContext via a serialize/deserialize method. It seems to work sufficiently well.

Now, a user may come along and choose to add or modify a Prop on a Foo. I attempt to Prop Save(Prop data) the new Prop. Initially I did so naively:

db.Prop.InsertOnSubmit(data);
db.SubmitChanges();

but this resulted in many duplicate Foo's being added to the database. The apparent solution was to attach the offending Foo to the new DataContext before insertion:

db.Foo.Attach(data.Foo); // Avoid duplicate records
db.TaskDuration.InsertOnSubmit(data);
db.SubmitChanges();

This seemed to work in the short term, but then I discovered that trying to add a second Prop to a Foo would result in a NotSupportedException.

So I find myself in a quandary. On the one hand, I must attach the Prop's Foo to the DataContext because I must avoid ridiculously duplicated records. But on the other hand, if I do, I munge the caller's Foo cache by attaching a Foo when the caller expects them to remain unattached, thus exploding a little later on. I can't detach in the callee because the callee can't change the caller's cached Foo, and an entity can't be detached once it's been attached anyway.

Am I doing something fundamentally wrong by using detached entities in a cache? Is there some better design for a detached scenario with Linq to Sql? Or do I need to start considering alternative technologies?