EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:在数据库中存储应用程序模型差异(XAFML)

当您在“解决方案向导”中启用安全系统的情况下创建新应用程序时,默认情况下,最终用户设置(模型差异)使用ModelDifferenceDbStore存储存储在数据库中。本主题描述如何在现有应用程序中启用此功能,以及如何在数据库中存储共享模型差异(管理员的设置)。

注意

移动应用程序不允许您将模型差异存储在数据库中,因此移动平台不支持本主题中描述的方法。

禁用安全系统后,将System.Security.Principal.WindowsIdentity.GetCurrent()。Name值用作用户标识符(传递给IModelDifference.UserId属性)。因此,您可以使用此处介绍的方法为具有禁用的安全系统的WinForms应用程序启用ModelDifferenceDbStore。但是,不建议您为不安全的ASP.NET应用程序启用ModelDifferenceDbStore,因为此实例中的所有用户的UserID都相同。禁用安全系统后,WinForms和ASP.NET都支持共享模型差异。

编辑位于WinForms模块项目中的WinModule.csWinModule.vb)文件。在重写的ModuleBase.Setup方法中,订阅XafApplication.CreateCustomModelDifferenceStoreXafApplication.CreateCustomUserModelDifferenceStore事件。在这些事件处理程序中,将ModelDifferenceDbStore实例传递给e.Store参数。将ModelDifference类型传递给ModelDifferenceDbStore构造函数。在这里,ModelDifference是来自DevExpress.Persistent.BaseImpl命名空间(用于XPO)或来自的内置持久对象。实现IModelDifference接口的DevExpress.Persistent.BaseImpl.EF命名空间(用于实体框架)。注意构造函数的contextId最后一个参数(用于初始化IModelDifference.ContextId属性)。在WinForms模块中,将其设置为“ Win”以区分在不同平台上为同一用户创建的模型差异。

public sealed partial class MySolutionWindowsFormsModule : ModuleBase {
    private void Application_CreateCustomModelDifferenceStore(Object sender, CreateCustomModelDifferenceStoreEventArgs e) {
        e.Store = new ModelDifferenceDbStore((XafApplication)sender, typeof(ModelDifference), true, "Win");
        e.Handled = true;
    }
    private void Application_CreateCustomUserModelDifferenceStore(Object sender, CreateCustomModelDifferenceStoreEventArgs e) {
        e.Store = new ModelDifferenceDbStore((XafApplication)sender, typeof(ModelDifference), false, "Win");
        e.Handled = true;
    }
    //...
    public override void Setup(XafApplication application) {
        base.Setup(application);
        application.CreateCustomModelDifferenceStore  = Application_CreateCustomModelDifferenceStore;
        application.CreateCustomUserModelDifferenceStore  = Application_CreateCustomUserModelDifferenceStore;
    }
}

类似地,编辑位于ASP.NET模块项目中的WebModule.csWebModule.vb)文件,但是将contextId参数设置为“ Web”而不是“ Win”。

public sealed partial class MySolutionAspNetModule : ModuleBase {
    private void Application_CreateCustomModelDifferenceStore(Object sender, CreateCustomModelDifferenceStoreEventArgs e) {
        e.Store = new ModelDifferenceDbStore((XafApplication)sender, typeof(ModelDifference), true, "Web");
        e.Handled = true;
    }
    private void Application_CreateCustomUserModelDifferenceStore(Object sender, CreateCustomModelDifferenceStoreEventArgs e) {
        e.Store = new ModelDifferenceDbStore((XafApplication)sender, typeof(ModelDifference), false, "Web");
        e.Handled = true;
    }
    // ...
    public override void Setup(XafApplication application) {
        base.Setup(application);
        application.CreateCustomModelDifferenceStore  = Application_CreateCustomModelDifferenceStore;
        application.CreateCustomUserModelDifferenceStore  = Application_CreateCustomUserModelDifferenceStore;
    }
}
注意

CreateCustomModelDifferenceStore事件被处理时,共享模式的差异(管理员设置)被存储在数据库中。如果共享模型差异的数据库记录已存在,则将忽略应用程序项目中Model.xafml文件的更改。要从Model.xafml重新加载设置,请启用管理UI并使用Import Shared Model Difference Action(或删除“ Shared Model Difference”记录并重新启动)。如果此行为不合适,请不要处理此事件。仅在RELEASE项目配置中处理它。

如果您使用实体框架,注册ModelDifferenceModelDifferenceAspect你的内实体类型DbConext

using DevExpress.Persistent.BaseImpl.EF;
// ...
public class MyDbContext : DbContext {
    // ...
    public DbSet<ModelDifference> ModelDifferences { get; set; }
    public DbSet<ModelDifferenceAspect> ModelDifferenceAspects { get; set; }
}

我使用XPO,运行模块设计器,然后将ModelDifferenceModelDifferenceAspect持久类型添加到“导出的类型”部分。

确保所有用户都对ModelDifferenceModelDifferenceAspect类型具有读/写访问权限。

public class Updater : ModuleUpdater {
    public override void UpdateDatabaseAfterUpdateSchema() {
        base.UpdateDatabaseAfterUpdateSchema();

        PermissionPolicyRole defaultRole = ObjectSpace.FindObject<PermissionPolicyRole>(new BinaryOperator("Name", "Default"));
        if(defaultRole == null) {
            defaultRole = ObjectSpace.CreateObject<PermissionPolicyRole>();
            defaultRole.Name = "Default";
            defaultRole.AddObjectPermission<PermissionPolicyUser>(SecurityOperations.Read, "[Oid] = CurrentUserId()", SecurityPermissionState.Allow);
            defaultRole.AddNavigationPermission(@"Application/NavigationItems/Items/Default/Items/MyDetails", SecurityPermissionState.Allow);
            defaultRole.AddMemberPermission<PermissionPolicyUser>(SecurityOperations.Write, "ChangePasswordOnFirstLogon", "[Oid] = CurrentUserId()", SecurityPermissionState.Allow);
            defaultRole.AddMemberPermission<PermissionPolicyUser>(SecurityOperations.Write, "StoredPassword", "[Oid] = CurrentUserId()", SecurityPermissionState.Allow);
            defaultRole.AddTypePermissionsRecursively<PermissionPolicyRole>(SecurityOperations.Read, SecurityPermissionState.Deny);
            defaultRole.AddTypePermissionsRecursively<ModelDifference>(SecurityOperations.ReadWriteAccess, SecurityPermissionState.Allow);
            defaultRole.AddTypePermissionsRecursively<ModelDifferenceAspect>(SecurityOperations.ReadWriteAccess, SecurityPermissionState.Allow);
            // The 'Create' permission is additionally required if you use the Middle Tier Application Server
            defaultRole.AddTypePermissionsRecursively<ModelDifference>(SecurityOperations.Create, SecurityPermissionState.Allow);
            defaultRole.AddTypePermissionsRecursively<ModelDifferenceAspect>(SecurityOperations.Create, SecurityPermissionState.Allow);                
        }
        sampleUser.Roles.Add(defaultRole);
        // ...
        ObjectSpace.CommitChanges();
    }
    // ...
}
提示

请参阅如何:启用用于管理用户模型差异的管理UI主题,以了解如何启用用于管理数据库中存储的模型差异的UI元素。

注意

一起使用时,不支持以下功能组合。

在这种配置中,您的应用程序从数据库加载有关自定义持久性字段的信息,然后更新数据库架构。但是,建立数据库连接后,线程安全数据层不支持更改数据模型。

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