Skip to main content
A newer version of this page is available.

How to: Use the Entity Framework Code First in XAF

  • 8 minutes to read

This topic demonstrates how to create a simple XAF application with a business model in a DbContext context.

Note

  • This topic demonstrates the code that can be generated automatically by the Solution Wizard. Proceed, if you want to implement the demonstrated functionality in the existing XAF solution. If you are creating a new XAF solution, use the wizard instead.

  • A more complex example is provided in the EFDemoCodeFirst application that is shipped with XAF.

Tip

A complete sample project is available in the DevExpress Code Examples database at https://supportcenter.devexpress.com/ticket/details/e4375/how-to-use-the-entity-framework-code-first-in-xaf.

1. Create an XAF Application

Create a new XAF solution called MySolution using the DevExpress v19.2 XAF Solution Wizard. Select Entity Framework Code First at the Choose ORM step and click Finish.

2. Add the Entity Data Model and Context

In this topic, we will not describe entities and context implementation in detail, as it is already described in MSDN (see Code First to a New Database). Here, we assume that you are already familiar with creating an EF data model in code.

  • In the module project, implement the following Employee and Task classes.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Runtime.CompilerServices;
    using DevExpress.Persistent.Base;
    // ...
    [DefaultClassOptions, ImageName("BO_Employee")]
    public class Employee : INotifyPropertyChanged
    {
        private int id;
        [Browsable(false)]
        public int Id { 
            get { return id; }
            protected set {
                if (id != value) {
                    id = value;
                    OnPropertyChanged();
                }
            }
        }
        private string firstName;
        public string FirstName {
            get { return firstName; }
            set {
                if (firstName != value) {
                    firstName = value;
                    OnPropertyChanged();
                }
            }
        }
        private string lastName;
        public string LastName {
            get { return lastName; }
            set {
                if (lastName != value) {
                    lastName = value;
                    OnPropertyChanged();
                }
            }
        }
        private DateTime? birthday;
        public DateTime? Birthday {
            get { return birthday; }
            set {
                if (birthday != value) {
                    birthday = value;
                    OnPropertyChanged();
                }
            }
        }
        private List<Task> tasks;
        public virtual List<Task> Tasks {
            get { return tasks; }
            set {
                if (tasks != value) {
                    tasks = value;
                    OnPropertyChanged();
                }
            }
        }
        #region INotifyPropertyChanged members
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null) {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }
    

    The INotifyPropertyChanged interface allows you to receive notifications from business classes when their property values are changed.

    In this code, you see the use of Data Annotations that influences UI generation - DefaultClassOptionsAttribute, ImageNameAttribute and FieldSizeAttribute, as well as the standard .NET Browsable attribute. As a result, the Employee and Task navigation items will be created, icons from the built-in image library will be used, the multiline editor will be displayed for the Task.Description property, and the service Id properties will be invisible in UI.

    Note

    You can use EF Power Tools to reverse engineer an existing database instead of writing code manually.

  • Implement the following DbContext descendant.

    using System.Data.Entity;
    // ...
    public class MyDbContext : DbContext {
        public MyDbContext(string connectionString) : base(connectionString) { }
        public DbSet<Employee> Employees { get; set; }
        public DbSet<Task> Tasks { get; set; }
    }
    

Note that the MyDBContext class should implement a constructor that takes the connectionString string parameter. This constructor will be called by the EFObjectSpaceProvider Object Space Provider internally.

3. Use the Entity Framework Object Space Provider

To use the EFObjectSpace instances to access data in your application, modify the default implementation of the CreateDefaultObjectSpaceProvider method located in WinApplication.cs (WinApplication.vb) and WebApplication.cs (WebApplication.vb) files. For details on this code, refer to the Use the Entity Framework Data Model topic.

using DevExpress.ExpressApp.DC;
using DevExpress.ExpressApp.EF;
// ...
protected override void CreateDefaultObjectSpaceProvider(CreateCustomObjectSpaceProviderEventArgs args) {
    args.ObjectSpaceProvider = new EFObjectSpaceProvider(typeof(MyDbContext), args.ConnectionString);
}

4. Specify the Connection String to the Database

To connect the database that was generated for your data model, specify the XafApplication.ConnectionString property in code or use the corresponding option in the App.config and Web.config files located in the WinForms and ASP.NET application projects. Refer to the Connect an XAF Application to a Database Provider topic for details.

5. Run the Application

Now you can run both the Windows Forms and ASP.NET applications. You will see that a UI is automatically generated for your data model.

Windows Forms:

EF_RuntimeWin

ASP.NET:

EF_RuntimeWeb

Note

To learn how to fill the database with predefined data, refer to the How to: Supply Initial Data for the Entity Framework Data Model topic.

See Also