天道酬勤,学无止境

entity-framework-migrations

实体框架:跨不同的 DbContext 共享实体(Entity Framework : Sharing entities across different DbContexts)

问题 我正在使用 EF6 开发插件应用程序,代码优先。 我有一个名为User的实体的主要上下文: public class MainDataContext : DbContext { public MainDataContext(): base("MainDataContextCS") {} public DbSet<User> Users { get; set; } } 然后是 PluginX 的另一个上下文,在另一个引用基础项目的项目中: public class PluginDataContext : DbContext { public PluginDataContext () : base("MainDataContextCS") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema("PluginX"); base.OnModelCreating(modelBuilder); } public DbSet<Booking> Bookings { get; set; } } 这在同一个数据库(同一个连接字符串)上巧妙地创建了PluginX.Bookings表。 这里的问题是Booking实体包含对User实体的引用:

2021-11-29 01:46:54    分类:技术分享    entity-framework   ef-code-first   entity-framework-6   entity-framework-migrations

如何在运行时在 DatabaseGeneratedOption.Identity、Computed 和 None 之间切换,而不必生成空的 DbMigrations(How to switch between DatabaseGeneratedOption.Identity, Computed and None at runtime without having to generate empty DbMigrations)

问题 我正在将旧数据库迁移到我们需要访问和“管理”(尽管听起来很矛盾)的新数据库,主要是通过实体框架代码优先。 我们使用的是 MS SQL Server 2014。 旧数据库包含一些带有计算列的表。 典型的 GUID 和 DateTime 的东西。 从技术上讲,这些列没有计算列规范,而是使用NEWID()和GETDATE()给定默认值的地方 我们都知道,配置DbContext来处理这些属性是很容易的,如下所示: modelBuilder.Entity<Foo>() .Property(t => t.Guid) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); modelBuilder.Entity<Bar>() .Property(t => t.DTS) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 以上将指示实体框架在INSERTs和UPDATEs期间忽略为此类属性提交任何提供的值。 但是现在我们需要允许导入遗留记录并维护旧值,包括PRIMARY KEY ,它被标记为IDENTITY 这意味着我们必须在插入这些记录时将Id 、 Guid和DTS属性设置为DatabaseGeneratedOption.None 。

2021-11-28 13:47:43    分类:技术分享    sql-server   entity-framework   ef-code-first   entity-framework-migrations   identity-insert

Entity Framework Code First DateTime 字段在修改时更新(Entity Framework Code First DateTime field update on modification)

问题 我有以下实体: public class User { public int UserId { get; set; } public string UserName { get; set; } public string UserAddress { get; set; } public DateTime CreateDate { get; set; } public DateTime? UpdateDate { get; set; } } 如何使User实体的UpdateDate字段在更新时成为服务器DateTime ? 也就是说,每当数据库中的实体被修改时, UpdateDate字段就会更改为那个确切的日期和时间,并且如果说UpdateDate = new DateTime(Datetime.Now.Ticks) 回答1 首先,如果您要存储本地时间,请考虑DateTimeOffset是更好的选择。 或者,您可以使用基于 UTC 的DateTime ,但我将在本例中显示DateTimeOffset 。 切勿为此目的存储基于本地的DateTime ,因为您会遇到时区和夏令时的问题。 另请参阅:反对 DateTime.Now 的案例。 接下来,考虑一个通用接口,您可以将其用于您希望跟踪创建/更新值的实体。 public interface IDatedEntity {

2021-11-28 12:19:29    分类:技术分享    c#   entity-framework   datetime   ef-code-first   entity-framework-migrations

Entity Framework 6 - 启用迁移时不创建表(Entity Framework 6 - Does not create tables when enabling Migrations)

问题 在我的应用程序中,我通过一些迁移启用代码优先迁移,我还使用 SQL Server Compact 进行集成测试。 当我运行我的测试时,实体框架创建一个空数据库并尝试在该空数据库上运行迁移并抛出The specified table does not exist. 根据这份报告,我认为 Entity Framework 6 中迁移的使用已经改变。 我使用Context.Database.Create();测试所有数据库初始化器Context.Database.Create(); 但在所有情况下,tabale 从未创建过。 回答1 我不知道这是否是 EntityFramework 的错误,但是当我将迁移配置类的命名空间从默认(项目名称/迁移)重命名为任何非默认名称时,迁移效果很好。 回答2 Context.Database.Create() 不会执行迁移! 它只创建空数据库。 要将数据库从代码更新到最新版本,您需要使用 DbMigrator.Update 方法: var migrator = new DbMigrator(new MyMigrationsConfiguration()); migrator.Update(); 或者,您可以使用 MigrateDatabaseToLatestVersion Database.SetInitializer(new

2021-11-28 06:58:02    分类:技术分享    entity-framework   entity-framework-migrations   entity-framework-6.1

EF Code First MigrateDatabaseToLatestVersion accepts connection string Name from config

While trying to implement EF Migrations in my project I am stuck at one place. EF Code First MigrateDatabaseToLatestVersion accepts connection string Name from config. In my case database name get known at Runtime (User selects it from dropdown). Just the way DbContext either accepts, ConnectionString or connectionString Name in it's constructor, "MigrateDatabaseToLatestVersion" does not accept the same System.Data.Entity.Database.SetInitializer (new MigrateDatabaseToLatestVersion<SrcDbContext, SRC.DomainModel.ORMapping.Migrations.Configuration>(connString)); Is there any other way to achieve

2021-11-28 06:10:43    分类:问答    c#   entity-framework   ef-code-first   entity-framework-migrations

EF Code First 迁移以部署旧版本(EF Code First Migrations to Deploy Older Version)

问题 我正在使用 TFS 发布管理进行持续集成和部署。 我在部署期间使用 migrate.exe 执行数据库迁移,当您从旧版本迁移到新版本时,这非常有用。 但是,当您想要部署旧版本的应用程序时,它会变得更加混乱。 基本上,保存上下文迁移的程序集必须知道如何从版本 3 转到版本 2。通常,您使用将要部署的程序集作为迁移源,但在这种情况下,您必须使用已经部署的程序集,因为他们是唯一知道如何从 v3 降到 v2 的程序集。 (版本 2 不知道 v3 甚至存在。) 我目前的计划是在部署期间以某种方式比较这两个程序集。 如果安装目录中的程序集包含比部署目录中的“更新”的迁移,我首先需要在部署目录的程序集中获取“最新”的可用迁移,然后执行: migrate.exe AssemblyInInstallationDir /targetMigration NewestFromAssemblyInDeploymentDir 在升级到较新版本的“正常”部署方案中,您可以执行以下操作: migrate.exe AssemblyInDeploymentDir 这是一种合法的方法吗? 我还没有研究使用 EF 库来评估每个程序集中的可用迁移。 还有一个挑战是,这些程序集中的每一个都是“相同”的,只是版本不同。 我可能需要将它们加载到单独的应用程序域中,然后使用跨应用程序域通信来获取我需要的信息。 编辑

2021-11-28 05:14:56    分类:技术分享    tfs   ef-code-first   entity-framework-migrations   release-management   ms-release-management

EF6 Code First - 可能导致循环或多个级联路径(EF6 Code First - may cause cycles or multiple cascade paths)

问题 我首先使用 EF6 代码。 我有两个班级: public class Player { [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] [Key] public int Id { get; set; } [Required, MinLength(2, ErrorMessage = "Player name must be at least 2 characters length")] public string Name { get; set; } [Required] public int TeamClubId { get; set; } [Required] public int TeamNationalId { get; set; } [Required, ForeignKey("TeamClubId")] public virtual Team Club { get; set; } [Required, ForeignKey("TeamNationalId")] public virtual Team National { get; set; } } 和: public class Team { [DatabaseGenerated(DatabaseGeneratedOption

2021-11-28 00:35:28    分类:技术分享    entity-framework   ef-code-first   relationship   entity-framework-migrations

Schema independent Entity Framework Code First Migrations

I have troubles using Entity Framework migrations targeting Oracle databases since schema name is included in migrations code and for Oracle, schema name is also user name. My goal is to have schema-independent Code First Migrations (to be able to have one set of migrations for testing and production enviroments). I have already tried this approach (using Entity Framework 6.1.3): 1) I have schema name in Web.config: <add key="SchemaName" value="IPR_TEST" /> 2) My DbContext takes schema name as a constructor parameter: public EdistributionDbContext(string schemaName) : base(

2021-11-27 18:45:22    分类:问答    c#   oracle   entity-framework   entity-framework-migrations

无法从 PK 中删除身份属性(Cant remove identity attribute from PK)

问题 我需要将其中一个表上主键的数据类型从 int 更改为字符串(我没有说我想要...)。 迁移生成以下代码: AlterColumn("dbo.Venues", "ID", c => c.String(nullable: false, maxLength: 128)); 这会导致 SQL Server 抱怨数据类型必须是 int、bigint 等,因为该列是标识列。 我添加了以下内容,但似乎没有效果: AlterColumn("dbo.Venues", "ID", c => c.Int(identity:false)); 问题:如何进行迁移以将数据类型从 int 更改为 string? 以下可能与我的问题有关,但不一定:迁移生成的唯一代码是上面显示的第一个 AlterColumn。 当以本机生成方式运行时,迁移导致 SQL Server 抱怨它无法更改列,因为存在依赖关系。 事实上,唯一的依赖是它是一个 PK(没有表将它引用为 FK)。 我将迁移修改为如下所示,现在我收到了如上所示的数据类型错误。 DropPrimaryKey("dbo.Venues"); AlterColumn("dbo.Venues", "ID", c => c.Int(identity:false)); AlterColumn("dbo.Venues", "ID", c => c.String

2021-11-27 13:24:32    分类:技术分享    entity-framework-5   entity-framework-migrations

如何使用迁移手动创建 asp.net Identity 表?(How do I create the asp.net Identity tables manually with migrations?)

问题 我希望 asp.net Identity 表存在于我的数据库中,并且在我实际运行 mvc 应用程序并创建用户之前生成相应的相应代码优先模型,以便我可以针对这些类编写一些逻辑在手之前。 有没有办法可以手动创建这些带有迁移的表/类? 回答1 如果你想在你的数据库中手动添加它,你必须用结构化查询语言编写它;) CREATE TABLE [dbo].[__MigrationHistory] ( [MigrationId] NVARCHAR (150) NOT NULL, [ContextKey] NVARCHAR (300) NOT NULL, [Model] VARBINARY (MAX) NOT NULL, [ProductVersion] NVARCHAR (32) NOT NULL ); GO CREATE TABLE [dbo].[AspNetRoles] ( [Id] NVARCHAR (128) NOT NULL, [Name] NVARCHAR (MAX) NOT NULL ); GO CREATE TABLE [dbo].[AspNetUserClaims] ( [Id] INT IDENTITY (1, 1) NOT NULL, [ClaimType] NVARCHAR (MAX) NULL, [ClaimValue] NVARCHAR (MAX) NULL,

2021-11-27 11:25:03    分类:技术分享    c#   asp.net-mvc   entity-framework   entity-framework-migrations