EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:在单个应用程序中同时使用实体框架和XPO

本主题演示如何创建同时使用实体框架(EF)eXpress持久性对象(XPO)业务模型的简单XAF应用程序。例如,如果您想在现有的基于XPO的XAF项目中重用非XAF应用程序中的Entity Framework模型,则需要这种方法。结果,您的应用程序将访问两个数据库,第一个数据库使用XPO,第二个数据库使用EF。

注意
  • 本主题演示了可由解决方案向导自动生成的代码。如果要在现有XAF解决方案中实现演示的功能,请继续。如果要创建新的XAF解决方案,请改用向导。您可以在向导的“选择ORM”页面中选择EF和XPO (“实体框架代码优先”和“ eXpress持久性对象”)。
  • 移动应用程序不支持EF业务模型。
提示

DevExpress代码示例数据库(http://www.devexpress.com/example=E4543)中提供了完整的示例项目。

在代码中添加EF数据模型

  • 参考EntityFramework.dllEntityFramework.SqlServer.dll程序集。您可以使用NuGet自动下载和引用这些程序集(请参阅获取实体框架)。支持的Entity Framework版本是6。
  • 请参考DevExpress.ExpressApp.EF.v 19.2 .dll程序集,该程序集在XAF中提供实体框架支持。
  • 模块项目中,实现以下EntityFrameworkSampleObjectMyDbContext类(了解有关XAF中的Entity Framework Code First的更多信息)。

    using System.ComponentModel;
    using EntityFramework.dll;
    using DevExpress.Persistent.Base;
    using DevExpress.ExpressApp.DC;
    // ...
    [DefaultClassOptions]
    public class EntityFrameworkSampleObject {
        [Browsable(false)]
        public int Id { get; protected set; }
        public string Name { get; set; }
        [FieldSize(FieldSizeAttribute.Unlimited)]
        public String Description { get; set; }
    }
    public class MyDbContext : DbContext {
        public MyDbContext(string connectionString) : base(connectionString) { }
        public DbSet<EntityFrameworkSampleObject> SampleObjects { get; set; }
    }
    

在代码中添加XPO数据模型

模块项目中,实现以下BaseObject后代。

using DevExpress.Xpo;
using DevExpress.Persistent.Base;
using DevExpress.Persistent.BaseImpl;
using DevExpress.ExpressApp.DC;
// ...
[DefaultClassOptions]
public class XpoSampleObject : BaseObject {
    public XpoSampleObject(Session session) : base(session) { }
    private string name;
    public string Name {
        get { return name; }
        set { SetPropertyValue(nameof(Name), ref name, value); }
    }
    private string description;
    [Size(SizeAttribute.Unlimited)]
    public String Description { 
        get {return description; }
        set { SetPropertyValue(nameof(Description), ref description, value); }
    }
}

填充DefaultObjectSpaceProviders集合

默认情况下,在WinApplication.cs(WinApplication.vb)和WebApplication.cs(WebApplication.vb)文件中实现的CreateDefaultObjectSpaceProvider方法将XPObjectSpaceProvider实例分配给ObjectSpaceProvider参数。而是,您可以将多个对象空间提供程序添加到ObjectSpaceProviders参数。XAF将自动确定应使用哪种对象空间提供程序为每种特定的业务对象类型创建对象空间。修改CreateDefaultObjectSpaceProvider的默认实现 Windows窗体和ASP.NET应用程序项目的方法采用以下方式。

using DevExpress.ExpressApp.DC;
using DevExpress.ExpressApp.EF;
// ...
protected override void CreateDefaultObjectSpaceProvider(CreateCustomObjectSpaceProviderEventArgs args) {
    args.ObjectSpaceProviders.Add(
        new XPObjectSpaceProvider(ConfigurationManager.ConnectionStrings["ConnectionStringXpo"].ConnectionString, null));
    args.ObjectSpaceProviders.Add(
        new EFObjectSpaceProvider(typeof(MyDbContext),
        ConfigurationManager.ConnectionStrings["ConnectionStringEF"].ConnectionString));
}

XAF将第一个注册的对象空间提供程序用于以下目的:

确保NonPersistentObjectSpaceProvider不是您的应用程序中的第一个注册的Provider。

指定EF和XPO的连接字符串

上一节中的代码从配置文件(Windows Forms应用程序项目中的App.config和ASP.NET中的Web.config)读取每个对象空间提供程序的连接字符串,因此在两个文件中都指定ConnectionStringXpoConnectionStringEF连接字符串。

<connectionStrings>
    <add name="ConnectionStringXpo" connectionString="Integrated Security=SSPI;
    Pooling=false;Data Source=(local);Initial Catalog=MultipleORMsExampleXpo" />
    <add name="ConnectionStringEF" connectionString="Integrated Security=SSPI;
    Data Source=(local);Initial Catalog=MultipleORMsExampleEF" />
</connectionStrings>

运行应用程序

现在,您可以运行该应用程序(Windows窗体或ASP.NET),以查看EF和XPO对象都可以访问。

外汇交易所

提示

如果要在注册多个对象空间提供程序时在代码中创建对象空间,请使用带有objectType参数的XafApplication.CreateObjectSpace方法的重载。在这种情况下,将创建一个支持特定对象类型的对象空间。

注意

XafApplication.ObjectSpaceProviders属性中注册多个对象空间提供程序时,将多次执行ModuleUpdater.UpdateDatabaseAfterUpdateSchema方法,每个已注册的提供程序执行一次。在此方法中,在访问特定类型的对象之前,请使用IObjectSpace.CanInstantiate方法检查当前对象空间是否支持此类型。

相关文章

转载保留此链接,注明出处