小编lig*_*cko的帖子

如何使用EF Model First数据库架构升级来避免数据丢失?

这是一个很长的问题,但如果我能就此得到一些好的建议,我将非常感激.简而言之,我正在寻找一种用于MS SQL数据库模式的版本升级的好方法,该方法还要求将数据从已删除的表移动到新表中.

我认为Stack Overflow是这个问题最合适的地方(不是dba.stackexchange.com),因为在它的核心,对于使用Entity Framework的.NET开发人员来说这是一个问题,而这个数据库部分主要由自动生成的sql组成.脚本.


背景

.NET应用程序和SQL数据库在Azure中运行(工作者角色中的应用程序和Azure SQL中的数据库).到目前为止,版本升级工作正常,因为所有数据库架构更改都很简单(如添加新列).但是,从现在开始,我还需要处理在升级期间将数据从一个表移动到另一个表.(我能够通过创建一个新数据库来临时修复此问题,使用旧数据库中的数据生成脚本并手动编辑脚本以使其适合新模式,但我希望有更好的方法).

我使用Entity Framework,我使用Model First.实体和关联在Visual Studio数据模型设计器中定义,这种方法非常适合我的应用程序.

我使用dacpac来升级Azure SQL数据库,这种方法一直运行到现在(但现在我将丢失数据,所以现在我必须找到一种方法将数据移动到新表).

我希望我可以继续使用实体框架并在设计器中定义实体/关联,但如果需要,可以从dacpac升级转换到另一种技术.

升级方法直到现在

  1. 我在设计器中添加了新实体(表),关联(关系)和属性(列).
  2. 我右键单击,选择"从模型中生成数据库...",这将生成一个.sql脚本,它删除旧的数据库对象并创建新的数据库对象.
  3. 我创建一个空数据库并运行脚本来创建表/键等.
  4. 在SQL Server Management Studio中,我右键单击数据库并选择"任务 - >提取数据层应用程序...".当向导完成时,我得到了我需要的dacpac(实际上我现在可以删除数据库,因为我只创建了它才能获得dacpac文件,因为我不认为我可以在Visual Studio数据模型设计器中生成它) .
  5. 我右键单击Azure SQL数据库并选择"任务 - >升级数据层应用程序..."并按照向导进行操作.到现在为止,我从来没有数据丢失,所以这个工作正常!

现在的情况

这是一个简单的例子来说明这个问题,但是从现在开始我似乎会经常进入几乎相同的情况.查看下图中的旧版和新版架构.假设数据库中已有数据.我需要ImageFile中的数据最终在ImageFileOriginal或ImageFileProcessed中,具体取决于IsOriginal布尔/位值.使用"升级数据层应用程序"我将收到有关数据丢失的警报.你会建议采用什么方法来解决这个问题?正如我之前所说,如果需要,可以将dacpac升级转换为其他技术.

旧架构 新架构

我已经阅读了有关Visual Studio数据库项目,Fluent Migrator,Red Gate和实体设计器数据库生成Power Pack(它不支持Visual Studio 2012),但我没有找到一个好办法.我承认我没有花一整天时间深入研究每种技术,但我当然花了一些时间尝试找到一种好的方法.

entity-framework database-migration ef-model-first dacpac azure-sql-database

8
推荐指数
1
解决办法
1590
查看次数

如何将泛型类型参数用作声明为具有类型约束的接口的属性的类型参数?

如何声明和使用通用接口(请参阅命名空间Sample2)以与命名空间Sample1中的类相同的方式工作?

我知道有一个解决方法(请参阅命名空间Sample2Modified),但这不是我想要实现的.


适用于类

使用类时,这很好用:

namespace Sample1
{
    public class ClassContainer<T1, T2>
        where T1 : T2
    { }

    public class ClassParent
    { }

    public class ClassChild : ClassParent
    { }

    public class ClassSampleDoesWork<TItem>
        where TItem : ClassParent
    {
        ClassContainer<IEnumerable<TItem>, IEnumerable<ClassParent>> SomeProperty { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

不适用于接口

但是,对于接口,编译器在ClassSampleDoesNotWork中声明属性时会发出此警告:

Error 16 The type 'System.Collections.Generic.IEnumerable<TItem>'
cannot be used as type parameter 'T1' in the generic type or method
'Sample2.IInterfaceContainer<T1,T2>'. There is no implicit reference
conversion from 'System.Collections.Generic.IEnumerable<TItem>' to
'System.Collections.Generic.IEnumerable<Sample2.IInterfaceParent>'.
Run Code Online (Sandbox Code Playgroud)

码:

namespace Sample2 …
Run Code Online (Sandbox Code Playgroud)

c# generics

8
推荐指数
1
解决办法
323
查看次数

如何从私有 azure devops feed 恢复 nuget 包?

背景

我在 azure devops 上的私有 nuget feed 中有 nuget 包,我尝试从本地 TFS 中使用它们。

这有效,但只持续了几个小时

在 azure devops 中,我导航到 Artifacts -> Connect to feed,然后单击链接“下载 NuGet + 凭据提供程序”。运行时CredentialProvider.VSS.exe -U URL_TO_FEED我得到了一个 jwt 令牌。

在 tfs on-prem 中,我导航到构建定义中的“NuGet 恢复”步骤。在“源和身份验证”中,我选择了“NuGet.config 中的源”,在“此帐户/集合之外的源的凭据”中,我单击了“管理”。在“添加新的 Team Foundation Server/Team Services 连接”对话框中,我选择了“基于令牌的身份验证”并填写了值。我将从 CredentialProvider.VSS.exe 获得的令牌放入“个人访问令牌”字段中。

nuget 包已恢复,因此一切看起来都很好,但第二天它就不再工作了,因为令牌仅在几个小时内有效(我对其进行了解码以进行验证)。

问题

我该怎么做才能完成这项工作?使用“个人访问令牌”似乎很奇怪,因为它不应该与我作为一个人相关(例如,如果我离开组织)。CredentialProvider.VSS.exe 生成的令牌的用户名是 VssSessionToken,这可能表明它不是与我相关的个人令牌,但我不知道。

tfs nuget azure-devops

3
推荐指数
1
解决办法
3364
查看次数