商信互联
当您在“解决方案向导”中启用安全系统的情况下创建新应用程序时,默认情况下,最终用户设置(模型差异)使用ModelDifferenceDbStore存储存储在数据库中。本主题描述如何在现有应用程序中启用此功能,以及如何在数据库中存储共享模型差异(管理员的设置)。
移动应用程序不允许您将模型差异存储在数据库中,因此移动平台不支持本主题中描述的方法。
禁用安全系统后,将System.Security.Principal.WindowsIdentity.GetCurrent()。Name值用作用户标识符(传递给IModelDifference.UserId属性)。因此,您可以使用此处介绍的方法为具有禁用的安全系统的WinForms应用程序启用ModelDifferenceDbStore。但是,不建议您为不安全的ASP.NET应用程序启用ModelDifferenceDbStore,因为此实例中的所有用户的UserID都相同。禁用安全系统后,WinForms和ASP.NET都支持共享模型差异。
编辑位于WinForms模块项目中的WinModule.cs(WinModule.vb)文件。在重写的ModuleBase.Setup方法中,订阅XafApplication.CreateCustomModelDifferenceStore和XafApplication.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;
}
}
Public NotInheritable Partial Class MySolutionWindowsFormsModule
Inherits ModuleBase
Private Sub Application_CreateCustomModelDifferenceStore(ByVal sender As Object, ByVal e As CreateCustomModelDifferenceStoreEventArgs)
e.Store = New ModelDifferenceDbStore(DirectCast(sender, XafApplication), GetType(ModelDifference), True, "Win")
e.Handled = True
End Sub
Private Sub Application_CreateCustomUserModelDifferenceStore(ByVal sender As Object, ByVal e As CreateCustomModelDifferenceStoreEventArgs)
e.Store = New ModelDifferenceDbStore(DirectCast(sender, XafApplication), GetType(ModelDifference), False, "Win")
e.Handled = True
End Sub
'...
Public Overrides Sub Setup(ByVal application As XafApplication)
MyBase.Setup(application)
AddHandler application.CreateCustomModelDifferenceStore, AddressOf Application_CreateCustomModelDifferenceStore
AddHandler application.CreateCustomUserModelDifferenceStore, AddressOf Application_CreateCustomUserModelDifferenceStore
End Sub
End Class
类似地,编辑位于ASP.NET模块项目中的WebModule.cs(WebModule.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;
}
}
Public NotInheritable Partial Class MySolutionAspNetModule
Inherits ModuleBase
Private Sub Application_CreateCustomModelDifferenceStore(ByVal sender As Object, ByVal e As CreateCustomModelDifferenceStoreEventArgs)
e.Store = New ModelDifferenceDbStore(DirectCast(sender, XafApplication), GetType(ModelDifference), True, "Web")
e.Handled = True
End Sub
Private Sub Application_CreateCustomUserModelDifferenceStore(ByVal sender As Object, ByVal e As CreateCustomModelDifferenceStoreEventArgs)
e.Store = New ModelDifferenceDbStore(DirectCast(sender, XafApplication), GetType(ModelDifference), False, "Web")
e.Handled = True
End Sub
' ...
Public Overrides Sub Setup(ByVal application As XafApplication)
MyBase.Setup(application)
AddHandler application.CreateCustomModelDifferenceStore, AddressOf Application_CreateCustomModelDifferenceStore
AddHandler application.CreateCustomUserModelDifferenceStore, AddressOf Application_CreateCustomUserModelDifferenceStore
End Sub
End Class
当CreateCustomModelDifferenceStore事件被处理时,共享模式的差异(管理员设置)被存储在数据库中。如果共享模型差异的数据库记录已存在,则将忽略应用程序项目中Model.xafml文件的更改。要从Model.xafml重新加载设置,请启用管理UI并使用Import Shared Model Difference Action(或删除“ Shared Model Difference”记录并重新启动)。如果此行为不合适,请不要处理此事件。仅在RELEASE项目配置中处理它。
如果您使用实体框架,注册ModelDifference和ModelDifferenceAspect你的内实体类型DbConext。
using DevExpress.Persistent.BaseImpl.EF;
// ...
public class MyDbContext : DbContext {
// ...
public DbSet<ModelDifference> ModelDifferences { get; set; }
public DbSet<ModelDifferenceAspect> ModelDifferenceAspects { get; set; }
}
Imports DevExpress.Persistent.BaseImpl.EF
' ...
Public Class MyDbContext
Inherits DbContext
' ...
Public Property ModelDifferences() As DbSet(Of ModelDifference)
Public Property ModelDifferenceAspects() As DbSet(Of ModelDifferenceAspect)
End Class
我使用XPO,运行模块设计器,然后将ModelDifference和ModelDifferenceAspect持久类型添加到“导出的类型”部分。
确保所有用户都对ModelDifference和ModelDifferenceAspect类型具有读/写访问权限。
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();
}
// ...
}
Public Class Updater
Inherits ModuleUpdater
Public Overrides Sub UpdateDatabaseAfterUpdateSchema()
MyBase.UpdateDatabaseAfterUpdateSchema()
Dim defaultRole As PermissionPolicyRole = ObjectSpace.FindObject(Of PermissionPolicyRole)(New BinaryOperator("Name", "Default"))
If defaultRole Is Nothing Then
defaultRole = ObjectSpace.CreateObject(Of PermissionPolicyRole)()
defaultRole.Name = "Default"
defaultRole.AddObjectPermission(Of PermissionPolicyUser)(SecurityOperations.Read, "[Oid] = CurrentUserId()", SecurityPermissionState.Allow)
defaultRole.AddNavigationPermission("Application/NavigationItems/Items/Default/Items/MyDetails", SecurityPermissionState.Allow)
defaultRole.AddMemberPermission(Of PermissionPolicyUser)(SecurityOperations.Write, "ChangePasswordOnFirstLogon", "[Oid] = CurrentUserId()", SecurityPermissionState.Allow)
defaultRole.AddMemberPermission(Of PermissionPolicyUser)(SecurityOperations.Write, "StoredPassword", "[Oid] = CurrentUserId()", SecurityPermissionState.Allow)
defaultRole.AddTypePermissionsRecursively(Of PermissionPolicyRole)(SecurityOperations.Read, SecurityPermissionState.Deny)
defaultRole.AddTypePermissionsRecursively(Of ModelDifference)(SecurityOperations.ReadWriteAccess, SecurityPermissionState.Allow)
defaultRole.AddTypePermissionsRecursively(Of ModelDifferenceAspect)(SecurityOperations.ReadWriteAccess, SecurityPermissionState.Allow)
' The 'Create' permission is additionally required if you use the Middle Tier Application Server
defaultRole.AddTypePermissionsRecursively(Of ModelDifference)(SecurityOperations.Create, SecurityPermissionState.Allow)
defaultRole.AddTypePermissionsRecursively(Of ModelDifferenceAspect)(SecurityOperations.Create, SecurityPermissionState.Allow)
End If
sampleUser.Roles.Add(defaultRole)
' ...
ObjectSpace.CommitChanges()
End Sub
' ...
End Class
请参阅如何:启用用于管理用户模型差异的管理UI主题,以了解如何启用用于管理数据库中存储的模型差异的UI元素。
一起使用时,不支持以下功能组合。
在这种配置中,您的应用程序从数据库加载有关自定义持久性字段的信息,然后更新数据库架构。但是,建立数据库连接后,线程安全数据层不支持更改数据模型。