I recently delivered a free webinar for DevelopMentor on n-tier application development using Entity Framework 4.0. In it I explained how to use what I call “Trackable Data Transfer Objects” to achieve the same result as “Self-Tracking Entities” but using a more lightweight tracking mechanism to achieve better interoperability, as I outlined in this blog post.
The screencast video is now available to be streamed or downloaded. The slides and code for the presentation are also available.
Hi,
when I execute first the service and then the clien, I get a “The underlaying provider failed to open” error.
I don’t have any idea what the problem is…
Any advice to solve this error?
Thanks,
Dominik.
It’s most likely that your connection string is not valid. Check to make sure that your service host has the connection string in app.config and that it’s valid. You need to first attached the Northwind database to your local SQL Server Express instance.
Hi,
I have been looking at your code sample and i had it working for awhile but now its coming up with a odd error, even when i restore your original code i get the same issue.
Error is:
Running transformation: System.IO.DirectoryNotFoundException: Could not find a part of the path ‘C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\\.edmx’.
Any advice to what i’ve done wrong?
Thanks,
John
Hi,
Is there a way to auto generate DataAccess classes?
Or do you know a tool that can do such? This would help a lot in to migrate faster.
Thanks,
Philip
Hi,
Your presentation is very helpful and i’ve updated my project to be compliant with your advices.
Nonetheless, I encounter an issue:
I’ve a USER class with a TRANSACTION collection associated to my user.
If I create a new user, with some new transactions associated, it works fine, like in your “consoleClient”.
But if I create a new user without TRANSACTION child, it fails.
I think the issue is in the “XXXXClientObjects” project.
The trackableCollection is instanciated only in the “onXXXXCreated” method.
So, if I get my user from context (the one without any transaction).
I’ve the error :
USER.TRANSACTION is not a ITrackabe collection
Do you have an idea ?
(sorry for my english, i’m french)
Thanks.
Nax.
@nax: Thanks very much for your question. Would you please send me your project so I can have a look (tony@tonysneed.com)? It may be that your “Transaction” class does not implement ITrackable. However, all classes generated by the xxx-Client.tt template will implement that interface. Additionally, collection properties will materialize as ChangeTrackingCollection. Note, however, that the collection properties will initialize to null, hence the use of a partial class that implements OnXXXCreated in order to initialize the property to a new collection. Ideally, code from the partial class should be placed in the T4 template (I just didn’t have time to do that initially).
Regards,
Tony
Tony,
Great article & demo once again!
The only problem I have with this approach is that your Tracking helper functions e.g. ApplyChanges(), AcceptChanges() etc rely heavily on OBjectContext & ObjectSet – this makes it very difficult to make a simple interfaces (e.g. IObjectContext, IObjectSet) that could be used for faking in tests. Do you have any suggestions for making your pattern testable.
Regds
Mark
@mark: I would suggest using the Repository and Unit of Work patterns to implement testing with fakes. There’s nothing about Trackable DTO’s, or Self-Tracking Entities, that precludes using these patterns. For example, I could have a repository interface like this:
interface INorthwindRepository
{
IObjectSet Customers { get; }
IObjectSet Order_Details { get; }
IObjectSet Orders { get; }
IObjectSet Products { get; }
}
For the NorthwindEntities class, all I have to do is change the context template to type the properties as IObjectSet, which is no big deal because ObjectSet already implements that interface. Then I can implement IObjectSet with a FakeObjectSet class that uses in-memory objects and create a FakeNorthwindEntities class that implements INorthwindRepository with properties that explose FakeObjectSet :
public IObjectSet Customers
{
get { return customers; }
}
FakeObjectSet customers = new FakeObjectSet();
Then you create an IUnitOfWork interface with a Save method (and optionally a Delete method). Both NorthwindEntities and FakeNorthwindEntities would implement the interface. NorthwindEntities would call ApplyChanges, SaveChanges, and AcceptChanges, but FakeNorthwindEntities would not. The thing you have to keep in mind is that in an n-tier architecture each operation is atomic and change state is stored in entities themselves.
Here is a sample showing EF testability features: http://tonysneed.com/elinq/download/ef-tdd.zip. I will have to take some time to come up with an n-tier sample that incorporates unit tests. Stay tuned for that. 🙂
Cheers,
Tony
Thanks Tony for you work. It does definitely show one what possible with EF and POCOs. We need more Architects like you.
Thank you Tony for an excellent tutorial, I have been looking for something like this that explain the N-tier architecture on a deep level. I do have a question for you though which I hope that you have time to answer. I’m developing a web application and I have a couple of question in regards to that, first where should I put my aspx file, second should I create multiple projects for all DTO’s and also where do I put them? I’m totally new to development of asp.Net applications. So it would be much apprecited if you could the time to answer my questions.
Thank you
/RZebra
See this blog post on the onion architecture for how to structure an asp.net mvc project: https://blog.tonysneed.com/2011/10/08/peeling-back-the-onion-architecture. There is also a sample project you can download.
Hi Tony!
Excellent tutorial, but where can I find the sources?
Cheers
Links to the source code are right in the blog post – first or second paragraph. 🙂
Somehow I’m getting an IIS 404 when clicking on http://tonysneed.com/elinq/download/TrackableDTO-2.zip. Seems to me like all your downloads on the blog are currently down.
Thank you!
Thanks for letting me now. I’ve submitted a ticket to my hosting company and will post a reply here when it’s been resolved.
Hi again Tony!
Any possibility for getting the sources via mail in the meantime?
That would be very much appreciated! 🙂
Cheers
The links from my blog have now been restored. Enjoy!
Tony
Hi, I run the application, and get the error “Error de proveedor subyacente”:
El código de usuario no controló System.ServiceModel.FaultException
Message=Error del proveedor subyacente en Open.
Source=NorthwindService
StackTrace:
en Service.NorthwindService.CreateOrder(Order order) en C:\work\N-Tier\TrackableDTO-2\TrackableDTO-2\NorthwindService\NorthwindService.cs:línea 37
en SyncInvokeCreateOrder(Object , Object[] , Object[] )
en System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
InnerException:
Sorry, by my bad English.
The service probably does not have rights to the database.
I’ve looked at your T4 code to read the metadata of the EDM that reference in the NorthwindService project. I can’t seem to get any ClientObjects to generate for the Code First approach through the service. Is it even possible to this?
In the past I’ve had to hard-code the path to the T4 template.