Architecture :: Entity Framework With 3 Layers Design
May 19, 2010
I am thinking to use entity model as DAL, how should I create the BLL then? What kind of datasourceobject should I use in the asp pages?
I am looking for best practice to use Entity framework 2 in the three layers design. I had experience at dataset with three layers design.
Should I use objectdatasource at the pages for gridviews? My guess is that entitydatasource by passed the BLL which is not good, so the only option left is the objectdatasource.
Could and should my BL object inherit those entity model in the DAL, so I dont need to recreate their object's property?
recently i've studied on ADO.NET's Entity Model Framework and say 'wow' as ORM is one of the fevourite pattern i practice..but suddenly i've come to an ambiguous situation when i'm going to start. i usually follow the following 3-tier architecture..
1. UI Layer 2. BLL - business logic layer 3. DAL - Data Access Layer a. DTO / DAO b. Gateway (contains the sql query/stored procedure and connection with DB)
now when i'm going to use the Entity Model Design,where the DBML/ .edmx File should be placed? Because many a times i'm using the DBML file as DTO because of the mapped objects.. in the same time, sometimes DBML ( .edmx file in .NET 4.0) contains CRUD methods and stored procedured method as well as methods with different selection operations,- which should be in Gateway. so where the .edmx file should be placed !?!! IN DTO namespace !? or in Gateway namespace!
moreover sometimes there is no need for the BLL which breaks the rules of inter-layer-communication (UI > BLL > DAL.Gateway)! what makes me confuse is, what should be the ideal n-tier architecture when i'll use the ADO.NET Entity Model Design Framework
i am creating a class library project and adding new ado.net data model into it. created model automatically generetes codes. ModelENtities and entity classes.
i want to separate ModelEntities context class and entity calsses to two layer as two class library. is this possible?
assume that I do this and when I update the model from database , do separated classes update?
It's appreciated if you could share your thought.I have seen a e-commerce website design which have a few layers:Common,DataAccess,BusinessLogic,Operational.In the Common layer,it includes all the classes with only attributes and properties,no methods nor data access codes here.
In the DataAccess layer,there is a class for each action per class in the Common layer.For example,
a class for the Select action of class A of Common layer, a class for the update action of class A of common layer, a class for the Select action of class�B of Common layer, etc... Is this a design I could use for a potential high trafic website?What's the pro and con of this design.
I am redesigning a Solution's Architecture to implement SOA.
After doing the design changes I have come up with:
MySolution.Client.MyProject.Web ...... //ASP.NET WebSite MySolution.Client.MyProject.Proxy .... //Service Proxy C# Library Project *[1] MySolution.Service ................... //Service.cs for Service.svc is here MySolution.Service.DataContract ...... //IService.cs for Service.cs is here *[2] [code]....
This project contains IService and Request/Response Classes
All methods in Service.cs takes the Request classes as input and return Response classes as output
Therefore this project is referenced by the 2 Client Projects(Web and Proxy), as it contains the IService and all of the Request/Response classes that will be required to communicate with Service.cs
*[3]MySolution.Model: This project contains the .edmx that is the Data Model of Entity Framework and some custom classes that are used in the project.
PROBLEM: Because I only use Request/Response classes to communicate between service and client, The MySolution.Service.DataContract project is only used by Service.cs and Repository.cs
And due to that all responses that Repository generates i have to map them to the properties of its respective response class (which make both the original returned entity, and the response class almost identical). But i am OKAY with it ...
e.g: GetCustomer() in Repository.cs method is called by Service.cs
GetCustomer() method in repository performs the LINQ query and return a "Customer" object
Service.cs then maps all the properties of "Customer" object to the "CustomerResponse" object
Service.cs then returns the "CustomerResponse" to the caller.
in this case most of the properties will repeat in both classes, if there is solution to this, its good, otherwise, I am fine with it.However, when Repository.cs's method GetCustomers() (Notice its not GetCustomer()) is called, it will return List of Customer object, and mapping this for return purpose would mean a "for loop" that iterates the collection and do the mapping ... this is NOT OKAY ...
is there any better way of doing this, considering I do not want to return "Customer" object without "CustomerResponse" as first of all it violates the SOA architecture, and secondly I don't want my Client Projects to have any reference to the Model or Repository projects.
I am new to Entity frameworks-EF. As, EF is built on top of ADO.NET...If so, will there be any performance issue when we use it?Same way MVC also targets Test Driven , rapid application development only ..What speciality does it add for end-users?As per my understanding ASP.Net 2.0 itself is powerful without MVC and/or EF...
If I want to be able to have a table Consultant, which is the user and their personal information, and I want this user to be able to select their proficiency in a number of Programs (software) on a scale from 0-5 (zero being no experience whatsoever), how do I do this best?
I mean I could have a Consultant table with a one-to-many relationship to a Program table, and then have all the limited Programs availalbe loaded by an XML file or something, and for each Consultant associate all the Programs and their Levels of proficiency. But that seems very wrong and inefficient.
It seems to me I should have a table with all the (limited number of) Programs, and then by some sort of association between the two by Ids. But I can't get my head around how to do this. I'm thinking many-to-many... But first, is this correct? Secondly, how do I do this in an Entity Framework Model? I usually create my database code first, i.e. create the EF model, and then generate database from model. Will I get a junction table where I can add the Level field, because basically a Consultant HAS A Program with a Level, or actually a list of Programs each with a Level.
At work I need to create a new web application, that will connect to an MySql Database.
(So far I only have expercience with Linq-To-Sql classes and MSSQL servers.)
My superior tells me to use the entity framework (he probably refers to Linq-To-Entity) and provide everything as a service based architecture. Unfortunately nobody at work has experience with that framework nor with a real nice server oriented architecture. This speficic project I'm leading will be long-term, meaning multiple years, so it would be best to design it the way, that multiple target plattforms like asp.net, c# wpf, ... could use it)For now, the main target plattform is ASP.net
So I do have the following questions:
1) Where can I read best what's really behind service oriented architecture (but for now beginner tutorials work fine as well) and how to use it in best practise?
2) So far I can't see a real difference between Linq-To-Sql classes and the information I've googled so far on the 'entity framework'. So, whats the difference? Where do I find nice tutorials for it?
3) Is there any difference in the entity framework regarding the database server (MSSQL or MySQL)? If not, does that mean that code snipperts I will stumble across will word database independent?
I am using the ADO.NET Entity Framework for loading data from the database. The classes are directly mapped to database tables in the database. The problem is that these classes are not optimal for binding to the UI elements. As a result of this I have some custom entities which are populated at the service layer and returned. It is these custom entities (classes) to which I bind the UI elements. My questions on this are1. Is populating these entities at the service layer the most appropriate way to do this. I personally do not think so because if we introduce some additional UI elements which need different entities then I have to modify the service layer again.2. What is the best approach/pattern to get this done.
I just tring to a complex (for me) with ado.net entity framework this is the structure: In practice it is a sort of group purchasing (Buyers) For each group of purchase (Buyer) should have the opportunity 'to select all products of the brands indicated in buyer I'm doing function to return correct data like this:
public List<Product> GetProductsByBuyer(int vBuyerId) { Buyersctx.Products.MergeOption = MergeOption.NoTracking; return (from lProduct in Buyersctx.Products.Include("Brand").Include("Buyers") where select lProduct).ToList(); }
I can't to understand clearly how to create strong and quickly application using EF. For example, I have class ForumPost (table ForumPost) for select one of record I write method like:
public ForumPost ForumPost(int ForumPostID) { return (from i in _dataContext.ForumPostSet where i.ForumPostID == ForumPostID select i).First(); }
all works. But on page (I use ASP.NET MVC) I should display info from another linked tables, ForumName (each post have ForumID) etc. So, I modify this method to:
public ForumPost ForumPost(int ForumPostID) { return (from i in _dataContext.ForumPostSet .Include("ChildPosts").Include("ParentPost").Include("Users").Include("Forums").Include("Tags").Include("ForumPostPolls") where i.ForumPostID == ForumPostID select i).First(); }
ok, all works. Then I want to make some actions in model with ForumPost, i.e.
public void RootPost(int PostID, ref Models.ForumPost Root) { ForumPost post = ForumPost(PostID); if (post.RootPost != null) { Root = ForumPost(post.RootPost.ForumPostID); } else Root = post; }
it works too. But problem is in speed. I not need in RootPost all those includes. So, I should to create one more method like:
private ForumPost ForumPostIncludes1(int ForumPostID) { return (from i in _dataContext.ForumPostSet .Include("ChildPosts") where i.ForumPostID == ForumPostID select i).First(); }
then ForumPostIncludes2, ForumPostIncludes3 etc... second way - redesign RootPost with LINQ expr, not with call another method. But in this way difficulties to change DB. third way? How to do it correctly?
While designing (and then implementing) a layered application:
Is it correct to use the same ORM objects accross all layers? (which would go against encapsulation).
Or the presentation, business and data layer should each have their own objects? (which would lead to lots of code repetition).
e.g. (just to illustrate the question): if one uses Linq to SQL in the Data Layer and Visual Studio's O/R designer to generate the ORM objects, are those objects supposed to be used in the Business and Presentation Layers as well.
i.e.: Are the objects associated with the entities that the application handles a crosscutting issue?
Is there a way to export a EF 4.0 Data Model to EF 3.5?
I looked around and found that we are not able to access EF 4.0 from a ASP.Net 3.5 project here: [URL]
Our project is the 1st to go to .Net 4.0 using Entity Framework and we (the team) were wondering if there was a way for the other projects that "might" need to access our data that are still using the .Net 3.5 framework.
How can I share the auto-generated entity data model (generated object classes) amongst all layers of my C# web app whilst only granting query access in the data layer? This uses the typical 3 layer approach: data, business, presentation.
My data layer returns an IEnumerable<T> to my business layer, but I cannot return type T to the presentation layer because I do not want the presentation layer to know of the existence of the data layer - which is where the entity framework auto-generated my classes.
It was recommended to have a seperate layer with just the data model, but I'm unsure how to seperate the data model from the query functionality the entity framework provides.
I have three layers like UI, business and data access in my asp.net web application project. If I pass say a company code from the UI to the business to the data access and I query the company details like company name, address, phone etc from the database using sqlhelper executedataset() which wil return me a dataset. Then how do I pass these company details back to the UI layer. Is it correct to just pass the datatable object to the business and UI.
I'm trying to create my first Asp.Net application from scratch. Tried to create this post in some of the other forums but I couldn't find a better place.
So, as the title says, I'm having trouble trying to model my application. I'm like an OOP newbie. I'll show my classes first and then I'll write my questions.
Model Layer
public class User { private int id; public int Id { get { return id; } set { id = value; } } private string login; public string Login { get { return login; } set { login = value; } } private string password; public string Password { get { return password; } set { password = value; } } } Data Access Layer public class BasicDAL { private SqlConnection connection; //>>Returns a new connection to the database public SqlConnection GetConnection() { //>>If connection is active close it before starting a new one if (connection != null) if (connecion.State != ConnectionState.Closed) connection.Close(); connection = new SqlConnection("MyConnectionStringHere"); return connection; } } public class UserDAL : BasicDAL { //>>Insert a new user public void Insert(User user); { /* Insert into DB */ } //>>Authenticate user login with its password public void Authenticate(User user); { /* Authentication code here */ } } Business Logic Layer
[Code]....
So, model layer is pretty simple. Just a user representation. On the Data Access Layer I have a basic class with a GetConnection method. All DAL classes will extend this one.
My first problem lies on Business Logic Layer. With the above scenario, I've placed the same methods that I placed at the DAL. BLL methods would call DAL. As simple as that but I believe It is not the best way to do it, is it? How can I improve those classes?
Also, I have to "try..catch" blocks. That's because I can't find good places for it. I mean, if I place a try..catch on GetConnection method, for instance, how my ASPX page would get this error? How my ASPX page can tell the difference between "database offline" and "sql syntax error" when executing "userBll.Insert(newUser);".
My problem is mainly placing the exception handlers. I understand I would probably have to change return type of some methods. I didn't change because I believe that will have something with the exception handlers.
Btw, please assume I can't use TableAdapters and stuff like that. I would like to create all layers by myself.
In my application, I'm binding a Collection of Supervisor type, which I'm feeling that it is an additional overhead. Becuase I only want his ID. So binding an object collection to the dropdown which seems no worth.
I have a quick question in regards to testing my validation. I have been looking through a few MVC examples and have noticed the 'Validating with a Service Layer' tutorial which is pretty nice. It discusses how to abstract your code out etc..My question is, that they have validation occuring in the service layer, if errors occur, the error + message then gets added to a model state dictionary.Now i want to test my model to make sure my business rules are being applied to it, but with this approach, for starters, the Validation method is not in the interface. Now, if the validation method was in the interface, during testing you would have to re-implement the validation on the testing side.Am i missing somthing? Where should your validation code go? I feel like it should go in the model, but then i have to track the errors on the model side.
I'm trying to write a web app using 4-tier design pattern ( Data Store, DAL, BLL and UI). Among other things this app would also implement a forum.
Suppose I want to move a thread from one forum to another. In order to do this, UI layer must pass down to other layers the ID of a thread and the ID of a forum to which I wish to move this thread ( UI would pass these parameters by calling method A in BLL layer and A would in turn call method B in DAL layer... ).
a) Now should one of the bottom layers provide some sort of checking mechanism to ensure that the two ID arguments supplied by UI layer really represent an existing thread and an existing forum or is it the responsibility of UI layer to provide valid ID values?
EDIT:
I would consider the ability to pass invalid IDs a bug.
Should non existing ID be considered a bug just in the case of moving a thread, or also in the case of displaying a thread. Thus when user navigates to page Showthread.aspx?ID={0}, if query string parameter ID references non existing ID, If none of the layers check for the validity of ID, then GridView simply won't display any
"But in this case it doesn't look like the ids are in any sort of list. If they were one could only assume that this would never happen as I assume the lists would be populated by a stored procedure or a DAL procedure that pulls all valid IDs."
But even if user chooses IDs from a set of list, by the time it posts the page back, the DB table containing this ID could be changed in the mean time by admin or whomever?!
I'm a junior programmer, i do not get the concept of MVC! My method of coding is seperating my application design into 3 layers:
Presentation Layer Business Layer Data Access Layer
I find it very practical to a junior developer or at least to me, so i do not really get the point of MVC since i believe MVC just tries to separate logic from UI. Right?
I decided to have this book to help me have a better idea on code design:
I doubt how to implement the layers FACADE, BLL and DAL, using DTOs specialized .. where:
public class ClassA { private int _Test1; public int Test1 { get { return _Test1; } set { _Test1 = value; } } } public class ClassAB : ClassA { private int _Test2; public int Test2 { get { return _Test2; } set { _Test2 = value; } } } public class ClassAC : ClassA { private int _Test3; public int Test3 { get { return _Test3; } set { _Test3 = value; } } }
In the database, there is the 3 tables, as described above.how do I implement the facade, bll and dal? only one class for 3 DTOs?
I am new to entity framework , it is really very good , but I want to know what is the difference between using entity framework with stored procedure or without stored procedure , which one the faster and what is the benefits for using stored procedures with entity framework.
I have an EDM, it includes the entities extension and history. My goal is to use history to keep track of all the changes made to extension entity. For example, if extension with ID 223 has its property 'Name_Display' changed - I want the history entity to record this.
I'm using ASP.NET with VB.NET. Where in my code do I put the hook to say, "update the history entity" and what should that hook look like?