代码迁移意外尝试重命名 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 -IgnoreChangeupdate-database

现在您将拥有您的模型所期望的 table。