Translate

Tuesday, September 8, 2015

Update Existing Entity using DBContext in Entity Framework Disconnected Scenario

In this article, you will learn how to update a single entity in a disconnected scenario.
If you use Database-First approach, then create an Entity Data Model as shown in the previous chapter for SchoolDB sample database. Or, if you use Code-First or Model-First approach, then create entities and context classes. In any case, entities and context classes will look similar.

Here, we will see how to update a single Student entity (not entity graph). The following is a Student entity.
    using System;
    using System.Collections.Generic;
    
    public partial class Student
    {
        public Student()
        {
            this.Courses = new HashSet<Course>();
        }
    
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public Nullable<int> StandardId { get; set; }
        public byte[] RowVersion { get; set; }
    
        public virtual Standard Standard { get; set; }
        public virtual StudentAddress StudentAddress { get; set; }
        public virtual ICollection<Course> Courses { get; set; }
    }
The following is a context class.
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Data.Entity.Core.Objects;
    using System.Linq;
    
    public partial class SchoolDBEntities : DbContext
    {
        public SchoolDBEntities()
            : base("name=SchoolDBEntities")
        {
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            
        }
    
        public virtual DbSet<Course> Courses { get; set; }
        public virtual DbSet<Standard> Standards { get; set; }
        public virtual DbSet<Student> Students { get; set; }
        public virtual DbSet<StudentAddress> StudentAddresses { get; set; }
        public virtual DbSet<Teacher> Teachers { get; set; }
  }
 The following example shows how to update a Student entity in the disconnected scenario:
    Student stud;
    //1. Get student from DB
    using (var ctx = new SchoolDBEntities())
    {
        stud = ctx.Students.Where(s => s.StudentName == "New Student1").FirstOrDefault<Student>();
    }

    //2. change student name in disconnected mode (out of ctx scope)
    if (stud != null)
    {
        stud.StudentName = "Updated Student1";
    }

    //save modified entity using new Context
    using (var dbCtx = new SchoolDBEntities())
    {
        //3. Mark entity as modified
        dbCtx.Entry(stud).State = System.Data.Entity.EntityState.Modified;     
        
        //4. call SaveChanges
        dbCtx.SaveChanges();
    }
As you see in the above code snippet, we are doing the following steps:
  1. Get the existing student from DB.
  2. Change the student name out of Context scope (disconnected mode)
  3. Pass the modified entity into the Entry method to get its DBEntityEntry object and then mark its state as Modified
  4. Call SaveChanges() method to update student information into the database.
SaveChanges will send the following update query to the database:

    exec sp_executesql N'update [dbo].[Student]
    set [StudentName] = @0, [StandardId] = @1
    where ([StudentID] = @2)',N'@0 varchar(50),
    @1 int,@2 int',@0='Updated Student1',@1=299,@2=267
In this way, we can easily update a single entity using DBContext in the disconnected mode.
DbContext.Entry method returns an instance of DBEntityEntry for a specified Entity. An instance of DbEntityEntry class providea access to information about a given entity and its state. You can change the state of an entity to Added, Updated, or Deleted.
In the next chapter you will learn how to delete a single entity in the disconnected mode.
 

 

Saturday, February 28, 2015

Using ASP.NET Routing in a Web Forms Application

This walkthrough shows how to modify an existing ASP.NET Web site to include ASP.NET routing features. At the end of this walkthrough the site will have three new Web pages. Hyperlinks in one of the new pages link to the other two pages by using routes. Because these hyperlinks use routing to create the link URLs, they do not need to be changed if the target pages change names or location.

In order to run this walkthrough, you must have the following:
  • Visual Studio 2010 or later versions.
  • An ASP.NET Web site that targets the .NET Framework version 4 or later versions. If you do not already have a Web site to work with, see Walkthrough: Creating a Basic Web Page in Visual Studio.

    Creating Routes

    Routes map URL patterns to physical files. To add routes to a Web site, you add them to the static (Shared in Visual Basic) Routes property of the RouteTable class by using the RouteCollection.MapPageRoute method.
    In the following procedure, you create a method that you will use to add the routes. You call the new method from the Application_Start handler of the Global.asax page.

    To add a method to the Global.asax file for adding routes

    1. If the Web site does not already have a Global.asax file, add one by following these steps:
      1. Right-click the Web project in Solution Explorer and then select Add New Item.
      2. Select Global Application Class and then click Add.
    2. Open the Global.asax file.
    3. After the Application directive, add an Import directive for the System.Web.Routing namespace, as shown in the following example:
    <%@ Import Namespace="System.Web.Routing" %>
    void RegisterRoutes(RouteCollection routes)
    {
    } 
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
    }
This code passes the static (Shared in Visual Basic) Routes property of the RouteData class to RegisterRoutes.
The preceding procedure added an empty method that you can use to register routes. You will now add code to this method that adds routes to the Web site.
When you have finished this procedure, your application will accept URLs like the following:
  • http://server/application/SalesReportSummary/2009
  • http://server/application/SalesReport/en-US/2009
  • http://server/application/ExpensesRoute/
  • http://server/application/ExpensesRoute/2009/
  • http://server/application/ExpensesRoute/en-US/2009?extrafield=value
ASP.NET routing will route URLs such as these to the Sales.aspx and Expenses.aspx pages.

To add routes

In the RegisterRoutes method, add the following code:
routes.MapPageRoute("",
    "SalesReportSummary/{year}",
    "~/sales.aspx");
 
This code adds an unnamed route that has a URL pattern that contains the literal value "SalesReportSummary" and a placeholder (URL parameter) named year. It maps the route to a file that is named Sales.aspx.
In the RegisterRoutes method, add the following code:

routes.MapPageRoute("SalesRoute",
    "SalesReport/{locale}/{year}",
    "~/sales.aspx");
This code adds a route that is named SalesRoute. You are naming this route because it has the same parameter list as the route that you will create in the following step. Assigning names to these two routes enables you to differentiate them when you generate URLs for them.
In the RegisterRoutes method, add the following code:

routes.MapPageRoute("ExpensesRoute",
    "ExpenseReport/{locale}/{year}/{*extrainfo}",
    "~/expenses.aspx", true,
    new RouteValueDictionary { 
        { "locale", "US" }, 
        { "year", DateTime.Now.Year.ToString() } },
    new RouteValueDictionary { 
        { "locale", "[a-z]{2}" }, 
        { "year", @"\d{4}" } });
 
This code adds a route that is named ExpensesRoute. This route includes a catch-all parameter named extrainfo. The code sets the default value of the locale parameter to "US", and it sets the default value of the year parameter to the current year. Constraints specify that the locale parameter must consist of two alphabetic characters and the year parameter must consist of four numeric digits.