I have a few repositories in my project. All repositories inherit from an abstract interface repository containing the public datacontext variable and a Save function for the entire DB.
In my controllers I want to make changes to the the db and in one of my functions I'm working with two different repositories. Calling the Save function on each of the repositories I'm using can cause a situation in which one of the calls to Save succeeds and and the other fails resulting in a need of rolling back the changes of the Save function that failed.
What is the best way to work against multiple repositories and access to the DB to avoid such a situation?
In a typical business application, a session is started and persisted across several pages. It is commited only when the transaction is complete. A good example of this is a tax preparation application. Once the session is started, it is persisted through session, cookies, or both. Nothing is written to file, or database, until the entire profile is complete and the refund/return is calculated. In such an ennvironment, is makes a great deal of sense to work with the structure imposed by domain driven design, and using a single repository to simple commit the session. However, there are times when this doesn't translate correctly, even when domain driven design is used.
An example of this is my forum project. While the entities themselves are good targets for domain driven design, I am not sure about the repositories. The basic structure is that a Category has many Forums, a Forum has many Threads, and a Thread has many posts. There are other things in there, but that's enough to describe what I want to get across. If a user has navigated to /Thread/Edit/42, and they have rights to edit it, all I am concerned about is fetching that record and displaying it. On postback, all I want is to be able to save it..................
Take the following scenario. I have multiple ASPX pages. Login, Logout, Main, Messages, etc... They all inherit from System.Web.UI.Page of course. For all the pages, I want to override the Render method from the Page class. I could easily copy and paste the same code into each page like so:
protected override void Render(HtmlTextWriter writer) { //Code Logic Here }
But if I had many pages, lets say 20, maintaining the code in each page could get very time consuming and error prone.That made me think a bit and I thought okay lets try this...override the function in each page but call a static function. That way changing the static function would result in a change for every page.Which works fine... But its not really nice and clean, having to override like that on every single page.
Could someone explain what happens to the Repositories that are created when they are no longer needed? Are they automatically disposed of, or should we dispose of them manually?
Using EF4 as the DAL, to keep the program efficient I have been building repositories for the Model that abstract the data needed for specific views or actions. I have also used the Iinterface for the methods and call them in the Controller to pass them to the View. At some point the program needs to pass a behavior or request that requires the creation of a new repository and the process may repeat itself over and over again. What happens to the repositories that created for previous views, but are no longer needed? Should the dispose be written into each repository, or does garbage collection take care of this? How should this handled?
I've been reading up on MVC 2 and the recommended patterns, so far I've come to the conclusion (amongst much hair pulling and total confusion) that:
Model - Is just a basic data container Repository - Provides data access Service - Provides business logic and acts as an API to the Controller
The Controller talks to the Service, the Service talks to the Repository and Model. So for example, if I wanted to display a blog post page with its comments, I might do:
post = PostService.Get(id); comments = PostService.GetComments(post); Or, would I do:
post = PostService.Get(id); comments = post.Comments;
If so, where is this being set, from the repository? the problem there being its not lazy loaded.. that's not a huge problem but then say I wanted to list 10 posts with the first 2 comments for each, id have to load the posts then loop and load the comments which becomes messy.All of the example's use "InMemory" repository's for testing and say that including db stuff would be out of scope. But this leaves me with many blanks, so for a start can anyone comment on the above?
I would like to start a debate on traditional repositories versus one built on the UnitOfWork pattern. In a traditional repository, we wrap inserts, updates and deletes in a transaction, but selects don't really need them. In addition, nhibernate configuration is typically done once per application due to BuildSessionFactory being rather expensive. We often have several repositories of this type (one per aggregate chain). We also need to have projected, ahead of time, exactly what kinds of queries we'll need in order to build the interfaces and concretes correctly. In a single UnitOfWork repository we have the ability to manage both the current session and transaction, perform several operations, and then commit any changes all at once. In such a repository we may opt to put our configuration in the constructor since (typically speaking) no more than one Action is called per request anyway, initializing it in the application doesn't seem like much of an overall gain in speed. I must admit, I'm very temped to use the UnitOfWork pattern, as the following code looks really nice to me:
Csharp Code: using (IUnitOfWork worker = new UnitOfWork()){// session and transaction are now both set // save changes to three itemsworker.SaveOrUpdate(item1);worker.SaveOrUpdate(item2);worker.SaveOrUpdate(item3); // grab a fourth var item4 = worker.Criteria<Foo>().Add(Expression.Eq("title", title)).UniqueResult<Foo>(); // delete the fourthworker.Delete(item4); // all pending operations are commited or rolled back as a single unit (if one fails, all are rolled back), and then disposed, along with the session}
My proposed UnitOfWork class is rather simple. It implements IDisposable where I use a try-catch-finally in Dispose() to attempt a tx.Commit(), doing a tx.Rollback on failure, and a cleaning everything up in the finally clause. It also exposes common things like SaveOrUpdate, Delete, GetAll, Get, and even a Critera<T>() for custom on-the-spot queries. So what are your thoughts on this? I'd really like to hear about your experience with this pattern.
Assuming my application did not warrant a full blown DDD setup, would Repositories still be useful? I like the way they shield from implementation details (such as use of Entity Framework) underneath. However Repositories tend to be tied to Aggregate Roots (the concept is still a holy grail to me) by definition.
I suppose the question could also be put as such: if I have a typical 3-tier application, with a business layer facade consisting of "logical grouping" classes based on functionality (rather than aggregate roots as in DDD) such as TradingManager and ContactsManager, would it make sense to also create "logical grouping" repositories. Or perhaps a Data Access Object, which I believe is like a Repository without the aggregate root requirement. Of course I will still have a Model (EF POCOs) that will be passed up and down between the layers.
Also, is what I just described would be considered as a Transaction Script approach? It's certainly not DDD, and not Active Record. I'm not even sure if Active Record exists with EF4 like it does with Nhibernate.
I am trying to understand how others structure n-layered applications when they do not follow DDD.
Are there advantages in creating complex types in EF4 Entities and then use the complex properties in the repositories; instead of creating the aggregates in the the repository themselves? I.e. If the customer repository consists of properties of 3 entities: customers, addresses, email would it make sense to create a complex type consisting of the address and email properties, and add them as a complex property of the customer entity then just call the customer entity and the complex property in the repository, rather than just creating the repository class and aggregate the entities in the repository.What are there advantages or disadvantages in doing this in a MVC3 application?
I have an .xls file that I am allowing a user to make changes to by entering values in TextBoxs within a GridView. In the excel file, there is a column (D) that does a basic (=C4-B4) function. The user is allowed to edit both the B and C columns, but not the one containing the function (D). I am using OleDbCommands to make changes to the .xls file, and that works fine. However, column D is not being updated. I have to physically open the excel file, then save it for the function column to be properly updated. What would be the easiest way to make sure the function is "run" and saved when changes to the source columns are made?
Edit Well, merely hiding the modalpopupextender that it is in saves the file. But I still have the problem of column D not being updated client-side. I assume that's something I'll have to do myself?
the save as works fine. but the alert wont popup in the else case. I tried RegisterStartupScript. I tried many options. But it seems that the response.end is stops the clientscript from happening.
I am writing in c# asp.net (ajax enabled website, but not in use), visual studio 2005.
I'm got 2 model objects. Category and CategoryItem. I try to add a CategoryItem to Category in my Controller but It wont save to database, and I know why because I don't know how to call the submitChanges on the add while using repository, I dont got the DBContext right there is you know what I mean?.. here I will show you with code.
As a new developer I'm getting thoroughly confused by naming and structural conventions for developing c# code using best practice.I appreciate it's perhaps applicable to each domain I am developing for but I've seen the code of many different open source projects and there seems to be a common theme. The successful projects have well thought out structure for maintenance and extensibility.The terms context, service, repository and controllers are used often and I wondered if these are open to interpretation or is there a consensus or convention on what, where or how these get used.
In an e-commerce platform I've seen there are order services, order contexts, customer repositories and product controllers for example. What should they do based on these names? Does a controller do something different to a service? When should you use a context? Is there a convention for namespaces? It's mind boggling when you try and push from a spoon fed newbie developer and try to move on.What software/tools should I really be looking at to develop quality code? Unit Testing, Continous Integration, Resharper, Mocking tools, DOI Containers, nHibernate.
I'm not really aware of blogs/books that will help me push on from being a proficient web developer into someone who can develop extensible, quality and testable code. There are big gaps in authors assumptions. You are either a newbie or a software architect. I want to push from being a junior developer with a long term aim of being a software architect. I realise it's all about patterns and practices but where are the training materials? I work on my own so don't have the opportunity of learning from others.
I am trying to build a site that will display a word ("Synset" in my code) from a "function call", (ultimately the word will come from another database but I'm ignoring that part for now). The user will click one of 4 radio buttons deciding if the word is "positive", "negative", "neutral", or "can not be determined". Then the user clicks "Save" the word is saved a MS SQL database, the function is called displaying a new word and the process is repeated.
So far I have been able to get this to mostly work by using the code below. The problem is that the function is called and the correct word displayed when the page loads the first time, when I click a radio button and then the "Submit" button, the word and value from the radio button are saved to the database but then no new word is displayed. The text just disappears. The new word is created, as I can see that new words are saved to the database when i click submit.
I'm thinking the issue might be because I'm binding the text attribute of the label I'm using to display the word to the sqldatasource, because it's probably trying to display the text from the database?
I've tried putting the code that gets and displays the new word in FormView1_PageIndexChanging() and submitButton_Click() and neither work.
I've tried to just call Response.Redirect("Default.aspx") in submitButton_Click() and this displays the word but nothing is saved to the database.
I have a text file.I need to get data from this text file and show on grid ,1)After this user can update information from gridview, 2)Click on save button save data on database.Before clicking on button data don't save on database.How to do that?
to do multiple upload but the method in button is not call at all URL...however i find out that i was not able to call the save as code in the button as the i use a default.aspx with a master page, so in the contentplaceholder i not able to place this enctype="multipart/form-data in it skip all this code
For i As Integer = 0 To Request.Files.Count - 1 Dim PostedFile As HttpPostedFile = Request.Files(i) If PostedFile.ContentLength > 0 Then Dim FileName As String = System.IO.Path.GetFileName(PostedFile.FileName) PostedFile.SaveAs(Server.MapPath("Files") + FileName) End If Next
so how what should i do ? i cannot change it in the master page as it will affect other aspx so where or what should i do to allow me to call this above method to work
<span style ="font-family:Arial">Click to add files</span> <input id="Button1" type="button" value="add" onclick = "AddFileUpload()" /> <br /><br /> <div id = "FileUploadContainer"> <!--FileUpload Controls will be added here -->
You know how the built in functions in VB.NET gives you the option to pass 1 parameter, 2, 3, or 4 all within 1 function, how do they do that? and when the intellesense comes out, there is a "1 of 4" on the top left of the intellesense and you can click to change and see what the other 4 options are.
I have an MS SQL function that is called with the following syntax: SELECT Field1, COUNT(*) AS RecordCount FROM GetDecileTable('WHERE ClientID = 7 AND LocationName = ''Default'' ', 10) The first parameter passes a specific WHERE clause that is used by the function for one of the internal queries. When I call this function in the front-end C# page, I need to send parameter values for the individual fields inside of the WHERE clause (in this example, both the ClientID & LocationName fields) The current C# code looks like this:
String SQLText = "SELECT Field1, COUNT(*) AS RecordCount FROM GetDecileTable('WHERE ClientID = @ClientID AND LocationName = @LocationName ',10)"; SqlCommand Cmd = new SqlCommand(SQLText, SqlConnection); Cmd.Parameters.Add("@ClientID", SqlDbType.Int).Value = 7; // Insert real ClientID Cmd.Parameters.Add("@LocationName", SqlDbType.NVarChar(20)).Value = "Default"; // Real code uses Location Name from user input SqlDataReader reader = Cmd.ExecuteReader();
When I do this, I get the following code from SQL profiler:
exec sp_executesql N'SELECT Field1, COUNT(*) as RecordCount FROM GetDecileTable (''WHERE ClientID = @ClientID AND LocationName = @LocationName '',10)', N'@ClientID int,@LocationID nvarchar(20)', @ClientID=7,@LocationName=N'Default'
When this executes, SQL throws an error that it cannot parse past the first mention of @ClientID stating that the Scalar Variable @ClientID must be defined. If I modify the code to declare the variables first (see below), then I receive an error at the second mention of @ClientID that the variable already exists.
exec sp_executesql N'DECLARE @ClientID int; DECLARE @LocationName nvarchar(20); SELECT Field1, COUNT(*) as RecordCount FROM GetDecileTable (''WHERE ClientID = @ClientID AND LocationName = @LocationName '',10)', N'@ClientID int,@LocationName nvarchar(20)', @ClientID=7,@LocationName=N'Default'
I know that this method of adding parameters and calling SQL code from C# works well when I am selecting data from tables, but I am not sure how to embed parameters inside of the ' quote marks for the embedded WHERE clause being passed to the function.
I used code to display multiple lines in label and save it into SQL server as Varchar(max). It works fine in label.text but in SQL table, it do not work.
Code: dim s as string s &="Good day" & "<br/>" s &="aspfun"
In label, it displays like below which I want:
Good day aspfun
but in SQL table, it displays like below which I do not want: Good day <br/> aspfun
How to code for carriage return/line feed to works in both way?
I want to enter multiple contacts in a web form. That is..if a click on any "Add" button, it should display another textbox to enter, after it shold save multiple contacts to the database...
I have the following code which toggles the visibility of one of a pair of DropDownLists based on the selected radio button. This code works but my problem is that I have several sets of controls just like this on a single form. How can I use a single JavaScript Toggle() function, irrespective of the ID of the RadioButtonList that triggered it?
function Toggle() { var list = document.getElementById("produceDDL"); var inputs = list.getElementsByTagName("input"); var selected; for (var i = 0; i < inputs.length; i++) { if (inputs[i].checked) { selected = inputs[i]; break; } } if (selected.value == 'Vegetables') { div1.style.display = 'none'; div2.style.display = 'block'; } else { div1.style.display = 'block'; div2.style.display = 'none'; } } <asp:radiobuttonlist ID="produceDDL" OnClick="javascript:Toggle();" RepeatDirection="Horizontal" runat="server"> <asp:ListItem Selected="True">Fruit</asp:ListItem> <asp:ListItem>Vegetables</asp:ListItem> </asp:radiobuttonlist> <div id="div1"> <asp:DropDownList ID="fruitDDL" Width="120" runat="server"> <asp:ListItem>Select</asp:ListItem> <asp:ListItem>Apples</asp:ListItem> <asp:ListItem>Oranges</asp:ListItem> </asp:DropDownList> </div> <div id="div2" style="display:none;"> <asp:DropDownList ID="vegDDL" Width="120" runat="server"> <asp:ListItem>Select</asp:ListItem> <asp:ListItem>Onions</asp:ListItem> <asp:ListItem>Potatoes</asp:ListItem> </asp:DropDownList> </div>