代码迁移意外尝试重命名 table
Code migration unexpectedly tries to rename table
我想按照中的建议实施更改日志
Dev Express XAF T474899
我正在使用 XAF 新解决方案向导生成的安全系统
我已经定义了一些业务对象来存储更改日志信息。
其中一个对象存储 link 给用户
public虚拟用户用户{get;放; }
在生成代码迁移时,我很惊讶地看到 Up() 方法添加了以下内容
RenameTable(name: "dbo.UserRoles", newName: "RoleUsers");
DropPrimaryKey("dbo.RoleUsers");
AddPrimaryKey("dbo.RoleUsers", new[] { "Role_ID", "User_ID" });
还有一次,我在 Up()
中发现了以下内容
RenameTable(name: "dbo.EventResources", newName: "ResourceEvents");
// lots of other stuff
DropPrimaryKey("dbo.ResourceEvents");
AddPrimaryKey("dbo.ResourceEvents", new[] { "Resource_Key", "Event_ID" });
在这两种情况下,创建实体的代码都是 Dev Express 库。
我已将此问题交叉发布到 Dev Express Support
Dev Express 业务对象在 DevExpress.Persistent.BaseImpl.EF;
中定义
我的 DbContext 上下文将它们称为
public DbSet<Role> Roles { get; set; }
public DbSet<User> Users { get; set; }
角色的元数据显示
用户的元数据显示
我自己的企业类包含
namespace SBD.JobTalk.Module.BusinessObjects
{
[NavigationItem("Configuration")]
[DisplayName("Staff")]
[DefaultProperty("Summary")]
[ImageName("BO_Employee")]
[Table("Staff")]
public class Staff : BasicBo
{
public Staff()
{
Person = new Person();
}
public virtual Person Person { get; set; }
[StringLength(100, ErrorMessage = "The field cannot exceed 100 characters. ")]
[scds.Index("IX_Staff_UserName", 1, IsUnique = true)]
public string UserName { get; set; }
[NotMapped]
public string Summary => $"{Person.FirstName} {Person.LastName}";
//public virtual User User { get; set; }
}
}
public abstract class BasicBo : IXafEntityObject
{
[Browsable(false)]
[Key]
public virtual int Id { get; set; }
public virtual void OnCreated()
{
}
public virtual void OnSaving()
{
}
public virtual void OnLoaded()
{
}
}
如果我取消注释代码使用户 属性 在 Staff 中,并生成一个迁移,则向上迁移是
public override void Up()
{
RenameTable(name: "dbo.UserRoles", newName: "RoleUsers");
DropPrimaryKey("dbo.RoleUsers");
AddColumn("dbo.Staff", "User_ID", c => c.Int());
AddPrimaryKey("dbo.RoleUsers", new[] { "Role_ID", "User_ID" });
CreateIndex("dbo.Staff", "User_ID");
AddForeignKey("dbo.Staff", "User_ID", "dbo.Users", "ID");
}
[更新]
有趣的是,Dev Express 表比我最初想象的要多。
主键是身份。
我想我正在使用在 Dev Express 添加 Allow/Deny 能力 (V16.1)
之前创建的标准身份验证
[更新]
当我使用上述设置创建一个新项目时,这里是 DbContext。
using System;
using System.Data;
using System.Linq;
using System.Data.Entity;
using System.Data.Common;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
using System.ComponentModel;
using DevExpress.ExpressApp.EF.Updating;
using DevExpress.Persistent.BaseImpl.EF;
using DevExpress.Persistent.BaseImpl.EF.PermissionPolicy;
namespace XafApplication1.Module.BusinessObjects {
public class XafApplication1DbContext : DbContext {
public XafApplication1DbContext(String connectionString)
: base(connectionString) {
}
public XafApplication1DbContext(DbConnection connection)
: base(connection, false) {
}
public XafApplication1DbContext()
: base("name=ConnectionString") {
}
public DbSet<ModuleInfo> ModulesInfo { get; set; }
public DbSet<PermissionPolicyRole> Roles { get; set; }
public DbSet<PermissionPolicyTypePermissionObject> TypePermissionObjects { get; set; }
public DbSet<PermissionPolicyUser> Users { get; set; }
public DbSet<ModelDifference> ModelDifferences { get; set; }
public DbSet<ModelDifferenceAspect> ModelDifferenceAspects { get; set; }
}
}
好的,我会试一试 :) 您的 Up() 代码正在尝试将 table UserRoles 重命名为 RoleUsers。这意味着你有一个先前的迁移,其中 UserRoles 是 table 名称 - 可能来自你的 DevEx 东西。如果他们在升级中更改模型,则可能会发生这种情况。当前的模型需要 RoleUsers 等,因此您需要到达那里。
所以第一个选项是让迁移进行重命名以匹配基础模型。我认为这不起作用或导致其他问题?
您也许可以 'fool' entity framework 将旧的 table 与流畅的代码或注释一起使用,但如果它有新的列或关系,则无法正常工作。
我会做的是:
1) 使用与之前相同的引用创建一个新的测试项目,并且
复制您的上下文和 DbSet。将连接字符串指向
新数据库。
2) 添加迁移并编写脚本:
update-database -Script
。
3) 检查这个脚本并用它来创建
数据库中所需的对象。从旧的迁移数据
tables 到新的如果需要的话。
4) 删除旧的 tables
5) 在你的实际
项目添加迁移以重新同步您的模型:
add-migration SyncDevExUpdate -IgnoreChange
、update-database
现在您将拥有您的模型所期望的 table。
我想按照中的建议实施更改日志 Dev Express XAF T474899
我正在使用 XAF 新解决方案向导生成的安全系统
我已经定义了一些业务对象来存储更改日志信息。
其中一个对象存储 link 给用户
public虚拟用户用户{get;放; }
在生成代码迁移时,我很惊讶地看到 Up() 方法添加了以下内容
RenameTable(name: "dbo.UserRoles", newName: "RoleUsers");
DropPrimaryKey("dbo.RoleUsers");
AddPrimaryKey("dbo.RoleUsers", new[] { "Role_ID", "User_ID" });
还有一次,我在 Up()
中发现了以下内容RenameTable(name: "dbo.EventResources", newName: "ResourceEvents");
// lots of other stuff
DropPrimaryKey("dbo.ResourceEvents");
AddPrimaryKey("dbo.ResourceEvents", new[] { "Resource_Key", "Event_ID" });
在这两种情况下,创建实体的代码都是 Dev Express 库。
我已将此问题交叉发布到 Dev Express Support
Dev Express 业务对象在 DevExpress.Persistent.BaseImpl.EF;
中定义我的 DbContext 上下文将它们称为
public DbSet<Role> Roles { get; set; }
public DbSet<User> Users { get; set; }
角色的元数据显示
用户的元数据显示
我自己的企业类包含
namespace SBD.JobTalk.Module.BusinessObjects
{
[NavigationItem("Configuration")]
[DisplayName("Staff")]
[DefaultProperty("Summary")]
[ImageName("BO_Employee")]
[Table("Staff")]
public class Staff : BasicBo
{
public Staff()
{
Person = new Person();
}
public virtual Person Person { get; set; }
[StringLength(100, ErrorMessage = "The field cannot exceed 100 characters. ")]
[scds.Index("IX_Staff_UserName", 1, IsUnique = true)]
public string UserName { get; set; }
[NotMapped]
public string Summary => $"{Person.FirstName} {Person.LastName}";
//public virtual User User { get; set; }
}
}
public abstract class BasicBo : IXafEntityObject
{
[Browsable(false)]
[Key]
public virtual int Id { get; set; }
public virtual void OnCreated()
{
}
public virtual void OnSaving()
{
}
public virtual void OnLoaded()
{
}
}
如果我取消注释代码使用户 属性 在 Staff 中,并生成一个迁移,则向上迁移是
public override void Up()
{
RenameTable(name: "dbo.UserRoles", newName: "RoleUsers");
DropPrimaryKey("dbo.RoleUsers");
AddColumn("dbo.Staff", "User_ID", c => c.Int());
AddPrimaryKey("dbo.RoleUsers", new[] { "Role_ID", "User_ID" });
CreateIndex("dbo.Staff", "User_ID");
AddForeignKey("dbo.Staff", "User_ID", "dbo.Users", "ID");
}
[更新] 有趣的是,Dev Express 表比我最初想象的要多。 主键是身份。
[更新] 当我使用上述设置创建一个新项目时,这里是 DbContext。
using System;
using System.Data;
using System.Linq;
using System.Data.Entity;
using System.Data.Common;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
using System.ComponentModel;
using DevExpress.ExpressApp.EF.Updating;
using DevExpress.Persistent.BaseImpl.EF;
using DevExpress.Persistent.BaseImpl.EF.PermissionPolicy;
namespace XafApplication1.Module.BusinessObjects {
public class XafApplication1DbContext : DbContext {
public XafApplication1DbContext(String connectionString)
: base(connectionString) {
}
public XafApplication1DbContext(DbConnection connection)
: base(connection, false) {
}
public XafApplication1DbContext()
: base("name=ConnectionString") {
}
public DbSet<ModuleInfo> ModulesInfo { get; set; }
public DbSet<PermissionPolicyRole> Roles { get; set; }
public DbSet<PermissionPolicyTypePermissionObject> TypePermissionObjects { get; set; }
public DbSet<PermissionPolicyUser> Users { get; set; }
public DbSet<ModelDifference> ModelDifferences { get; set; }
public DbSet<ModelDifferenceAspect> ModelDifferenceAspects { get; set; }
}
}
好的,我会试一试 :) 您的 Up() 代码正在尝试将 table UserRoles 重命名为 RoleUsers。这意味着你有一个先前的迁移,其中 UserRoles 是 table 名称 - 可能来自你的 DevEx 东西。如果他们在升级中更改模型,则可能会发生这种情况。当前的模型需要 RoleUsers 等,因此您需要到达那里。
所以第一个选项是让迁移进行重命名以匹配基础模型。我认为这不起作用或导致其他问题?
您也许可以 'fool' entity framework 将旧的 table 与流畅的代码或注释一起使用,但如果它有新的列或关系,则无法正常工作。
我会做的是:
1) 使用与之前相同的引用创建一个新的测试项目,并且 复制您的上下文和 DbSet。将连接字符串指向 新数据库。
2) 添加迁移并编写脚本:
update-database -Script
。
3) 检查这个脚本并用它来创建 数据库中所需的对象。从旧的迁移数据 tables 到新的如果需要的话。
4) 删除旧的 tables
5) 在你的实际
项目添加迁移以重新同步您的模型:
add-migration SyncDevExUpdate -IgnoreChange
、update-database
现在您将拥有您的模型所期望的 table。