How to: Use the Entity Framework Code First in XAF 如何:在 XAF 中使用EF CodeFirst

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

本主题演示如何在 DbContext 上下文中使用业务模型创建简单的 XAF 应用程序。

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.
  • 本主题演示解决方案向导可以自动生成的代码。如果要在现有 XAF 解决方案中实现演示的功能,请继续。如果要创建新的 XAF 解决方案,请使用向导。
  • 在随 XAF 附带的 EFDemoCodeFirst 应用程序中提供了更复杂的示例。
Tip 提示
A complete sample project is available in the DevExpress Code Examples database at http://www.devexpress.com/example=E4375
完整的示例项目可在 DevExpress 代码示例数据库中找到,http://www.devexpress.com/example=E4375

.

1. Create an XAF Application

1. 创建到 XAF 应用程序

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.

使用 DevExpress v19.2 XAF 解决方案向导创建新的 XAF 解决方案,称为 MySolution。在"选择 ORM"步骤中首先选择实体框架代码,然后单击"完成"。

2. Add the Entity Data Model and Context

2. 添加实体数据模型和上下文

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.

在本主题中,我们将不详细描述实体和上下文实现,正如 MSDN 中已经描述的那样(请参阅新数据库的代码优先)。在这里,我们假设您已经熟悉在代码中创建 EF 数据模型。

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

  • 在模块项目中,实现以下员工和任务类。
    Employee (C#)
    Task (C#)
    Employee (VB.NET)
    Task (VB.NET)

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 INotify Property Changed interface allows you to receive notifications from business classes when their property values are changed.

 INotify 属性更改界面允许您在业务类的属性值发生更改时接收来自业务类的通知。

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

 在此代码中,您将看到影响 UI 生成的数据注释的使用 - 默认类选项属性、图像名称属性和字段Size属性,以及标准 .NET 可浏览

 

  • 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.

  • 属性。因此,将创建员工和任务导航项,使用内置图像库中的图标,将显示 Task.描述属性的多行编辑器,并且服务 Id 属性将在 UI 中不可见。
    Note 注意
    You can use EF Power Tools to reverse engineer an existing database instead of writing code manually.
    您可以使用 EF Power Tools 对现有数据库进行反向工程,而不是手动编写代码。
  • Implement the following DbContext descendant.

  • 实现以下 DbContext 后代。

    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.

请注意,MyDBContext 类应实现采用连接字符串字符串参数的构造函数。此构造函数将由 EFObjectSpaceProvider 对象空间提供程序内部调用。

 

3. Use the Entity Framework Object Space Provider

3. 使用实体框架对象空间提供程序

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.

要使用 EFObjectSpace 实例访问应用程序中的数据,请修改位于WinApplication.cs (WinApplication.vb) 和WebApplication.cs (WebApplication.vb) 文件中的"创建默认对象空间提供程序"方法的默认实现。有关此代码的详细信息,请参阅使用实体框架数据模型主题。

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

4. 指定到数据库的连接字符串

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.

要连接为数据模型生成的数据库,请在代码中指定 XafApplication.ConnectionString 属性,或在 WinForms 和ASP.NET应用程序项目中的 App.config 和 Web.config 文件中使用相应的选项。有关详细信息,请参阅将 XAF 应用程序连接到数据库提供程序主题。

5. Run the Application

5. 运行应用程序

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 窗体和ASP.NET应用程序。您将看到自动为数据模型生成 UI。

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.
要了解如何使用预定义数据填充数据库,请参阅"如何:为实体框架数据模型提供初始数据"主题。
posted @ 2019-12-18 16:34  code first life  阅读(262)  评论(0编辑  收藏  举报