标签: entity-framework-migrations

dotnet ef dbcontext脚手架命令--data-annotations或-d命令行参数似乎不起作用

我有一个简单的数据库,其中有一张表,该表具有各种属性。

我正在使用最新的 .NET core 6 和最新的 EF (6.0.4)

我想构建我的数据库以便它生成模型,所以我运行命令:

dotnet ef dbcontext scaffold "Server=MyServerName;Database=MyDBName;User Id=sa;Password=abc123;" 
Microsoft.EntityFrameworkCore.SqlServer -o Model --no-pluralize -d -f
Run Code Online (Sandbox Code Playgroud)

-d 命令应该使用数据注释而不是流畅注释,但事实并非如此。我最终得到一个MyTable类,其中清楚地列出了属性,例如public int MyTableId; public string MyTableProperty;....,然后在我的MyDBNameContextOnModelCreating方法中,有几页这样的内容:

 modelBuilder.Entity<MyTable>(entity =>
            {
                entity.HasIndex(e => e.SomeColumn, "idx_somecolumn");

                entity.Property(e => e.firstcolumn)
                    .HasColumnType("decimal(8, 1)")
                    .HasColumnName("FirstColumn");

                ...
Run Code Online (Sandbox Code Playgroud)

这真是太可怕了。帮助中是这么说的:

-d|--data-annotations 使用属性来配置模型(如果可能)。如果省略,则仅使用 Fluent API。

我可以煞费苦心地手动完成并添加注释,但如果我将来由于更改而重新生成,那么它将撤消我的工作。

数据注释属性不起作用是否有原因?

.net scaffolding entity-framework-core entity-framework-migrations

5
推荐指数
1
解决办法
2400
查看次数

docker 容器重新启动时 Database.Migrate 失败

我已在 Docker 上部署了 ASP.NET Core Web API。我的应用程序还与 Docker 容器中的 SQL Server 交互。

这是我的docker-compose.yml文件:

 version: '3'
 services:
     db:
         image: mcr.microsoft.com/mssql/server
         container_name: db
         ports:
             - 1533:1433
         environment:
             - TZ=Asia/Tehran
             - ACCEPT_EULA=Y
             - MSSQL_SA_PASSWORD=******
         user: root
         volumes:
             - ./mssql:/var/opt/mssql/data
    kava-service:
        image: service:1.0.0
        container_name: service
        expose:
            - 9001
        ports:
            - 9001:9001
        depends_on:
            - db
        environment:
            - ASPNETCORE__ENVIRONMENT=Production
            - TZ=Asia/Tehran
            - AUTO__MIGRATE=true
            - ConnectionStrings__BusinessDomainConnectionString=Server=db;Initial Catalog=Kava.BusinessDomain;User ID=sa;pwd=****;MultipleActiveResultSets=true;
            - ConnectionStrings__RecordsConnectionString=Server=db;Initial Catalog=Kava.Records;User Id=sa;pwd=****;MultipleActiveResultSets=true;
Run Code Online (Sandbox Code Playgroud)

当我运行 docker 容器(使用docker-compose)时,它工作正常。但是,如果我重新启动此容器,它就不起作用,并且应用程序将退出并显示以下消息:

用户“sa”登录失败。原因:无法打开显式指定的数据库“Kava.BusinessDomain”[客户端:172.18.0.4] kava-service
未处理的异常。Microsoft.Data.SqlClient.SqlException(0x80131904):数据库“Kava.BusinessDomain”已存在。选择不同的数据库名称。

当我删除这个数据库时,一切正常,但我不想删除它。

在开发中(我的意思是 Visual Studio)一切都很好,但在生产中(Docker),迁移无法按预期进行。

这是我的迁移命令: …

c# docker entity-framework-core asp.net-core-webapi entity-framework-migrations

5
推荐指数
1
解决办法
231
查看次数

代码优先迁移 MissingManifestResourceException

我目前正在为新数据库创建 InitialCreate 迁移。我是这个迁移框架的新手,不知道它到底生成了什么,我一直在运行update-database以查看结果,删除数据库然后update-database在进行一些更改以查看结果后再次运行。

现在我做了两次更改,去运行更新并收到如下错误:

应用基于代码的迁移:201209121936571_InitialCreate。System.Resources.MissingManifestResourceException: 找不到适合指定区域性或中性区域性的任何资源。确保在编译时将“$assemblyName$.resources”正确嵌入或链接到程序集“$assemblyName$”中,或者确保所有所需的附属程序集都是可加载的并已完全签名。在 [堆栈跟踪]

然后它以红色结尾

找不到适合指定文化或中性文化的任何资源。确保在编译时将“$assemblyName$.Migrations.InitialCreate.resources”正确嵌入或链接到程序集“$assemblyName$”中,或者确保所有所需的附属程序集都可加载且已完全签名。

我第一次遇到这个问题时,我删除了迁移文件夹,enable-migrations重新进行了更改并能够运行迁移。

它再次发生,我不想每次发生这种情况时都必须重新创建文件。有谁知道如何更正此问题以使迁移再次工作?

entity-framework entity-framework-5 entity-framework-migrations

4
推荐指数
1
解决办法
3024
查看次数

实体框架代码优先迁移

运行以下命令时

pm> Update-Database
Run Code Online (Sandbox Code Playgroud)

出现以下错误

System.Reflection.TargetInitationException:调用目标已引发异常。---> System.TypeInitializationException:“System.Data.Entity.SqlServer.SqlProviderServices”的类型初始值设定项引发异常。---> System.TypeLoadException:程序集“EntityFramework.SqlServer,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”中类型“System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy”中的方法“ExecuteAsync”没有执行。

c# asp.net-mvc-4 entity-framework-6 entity-framework-migrations

4
推荐指数
1
解决办法
6135
查看次数

在 DB Migration EF 6 Code First 中更改存储过程 - 如何将 null 作为参数的默认值传递

我正在使用空迁移来更新我的数据库中的存储过程。存储过程是在数据库的初始创建中添加的自定义存储过程。

我在 DbMigration 类中发现了“AlterStoredProcedure”方法,这可以更新存储过程,但是我必须传递存储过程的参数,并且我想将布尔值和一些整数的默认值设置为空,但我似乎无法让它发挥作用。

    AlterStoredProcedure(
                    name: "[dbo].[FT_People_PersonFullTextSearch]",
                    parametersAction: 
                       p => new { 
                                   searchTerm = p.String(600), 
                                   isArchived = p.Boolean(false), 
                                   isActive = p.Boolean(null), 
                                   genderFilter = p.Int(null), 
                                   rankingFilter = p.Int(null) 
                                 },
                    body: "the body of my stored proc....");
Run Code Online (Sandbox Code Playgroud)

上面的代码产生

ALTER PROCEDURE [dbo].[FT_People_PersonFullTextSearch]
    @searchTerm [nvarchar](600),
    @isArchived [bit] = 0,
    @isActive [bit],
    @genderFilter [int],
    @rankingFilter [int]
AS
BEGIN
Run Code Online (Sandbox Code Playgroud)

代替

ALTER PROCEDURE [dbo].[FT_People_PersonFullTextSearch]
    @searchTerm nvarchar(600), 
    @isArchived bit = 0,
    @isActive bit = null,
    @genderFilter int = null,
    @rankingFilter int = null
AS 
BEGIN
Run Code Online (Sandbox Code Playgroud)

有谁知道如何获取要生产的参数@isActive bit …

c# entity-framework-6 entity-framework-migrations

4
推荐指数
1
解决办法
2620
查看次数

实体约束“检查”代码优先

我制作了一张表格,将商店与 Table1 或 Table2(和其他信息)相关联

Id
IdStore_FK
IdTable1_FK
IdTable2_FK
SomeOtherFieldsThatDoesntMatterRightNow
Run Code Online (Sandbox Code Playgroud)

我创建了一个检查约束以确保它永远不会同时填充两个 FK,并且必须只填充其中一个(XOR):

ALTER TABLE TABLE0 ADD CHECK ((IdTable1_FK IS NULL AND IdTable2_FK IS NOT NULL) OR (IdTable1_FK IS NOT NULL AND IdTable2_FK IS NULL))
Run Code Online (Sandbox Code Playgroud)

但是我在和之后alter table 手动运行了它。我需要仅使用代码来制定这些限制,以便能够发送给我的经理。add-migrationupdate-database

如何告诉实体框架仅使用我的代码来创建它?
是否有任何 DataAnnotation 可以做到这一点?

我试图modelBuilder.Sql("ALTER TABLE XXX....")Up特定迁移的方法中添加。我只能add-migration创建文件的之后将该行添加到迁移文件中。

每次启动后的种子查询检查约束是否存在,如果不存在则创建它对我来说似乎并不酷。此外,它只会在我运行代码时运行,而不是与迁移/更新数据库一起运行。

.net c# entity-framework .net-core entity-framework-migrations

4
推荐指数
1
解决办法
3872
查看次数

EF Core 中使用 Fluent API 的一对一关系

我在用 EF Core 2.1

如何在 EF Core 中映射一对一关系。我有Customer&Course域实体,其中一位客户将拥有一门课程。

这就是我的 Customer & CoursePOCO 的样子。

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }

}

public class Course
{
    public int Id { get; set; }
    public string CouseName { get; set; }
    public virtual Customer Customer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 FluentAPI。

 public class CourseConfiguration : IEntityTypeConfiguration<Course>
{
    public void Configure(EntityTypeBuilder<Parent> builder)
    {
        builder.HasKey(x => x.Customer.Id) //not …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework-core asp.net-core ef-core-2.1 entity-framework-migrations

4
推荐指数
1
解决办法
3161
查看次数

处理 SQLite EF 核心限制 - 基础操作

根据文档,EF Core SQLite 不支持使用迁移进行数据库开发的一些基本操作(例如删除列、设置外键等)。那么如何执行简单的数据库结构更改,例如在不丢失数据的情况下删除列并保持快照模型与数据库同步(无脚手架)?

是否值得付出努力,还是我应该先使用数据库并为模型使用脚手架命令更新?如果我不能在迁移中执行所有必要的操作来更新我的数据库,那么我就不能利用迁移的好处来恢复我的数据库结构。那么在 EF-Core-Sqlite 中使用迁移的优势在哪里呢?ORM 应该减少工作,而不是使工作变得更加困难。

c# sqlite entity-framework entity-framework-core entity-framework-migrations

4
推荐指数
1
解决办法
1707
查看次数

EF Core 在迁移 (UP) 时将列数据从表移动到另一个表

我通过从表中删除一列到另一列来更新我的数据模型,但我在此列中有数据

为此,我首先在新表中添加新列并完成。

现在我想列数据从旧表迁移到新表,我正在考虑在Up(MigrationBuilder migrationBuilder)方法中进行但我不知道正确的方法。

所以,我问是否有人知道我可以从哪里开始。

谢谢你们!

c# entity-framework-core ef-model-builder entity-framework-migrations

4
推荐指数
2
解决办法
3275
查看次数

如何在 EF Core Code First 中自定义迁移生成?

我的DbContext. 当从它继承时,我需要生成一个额外的“SQL”迁移操作来为它创建一个特定的触发器。它通过检查重叠范围来确保表结构是一致的。由于在 SQL Server 中没有重叠的索引或检查约束,我必须使用触发器(在检查约束中使用函数会导致与迁移相同的问题以及 SQL 中的混乱函数“命名空间”)。

由于我在OnModelCreating考虑更改生成的迁移期间没有找到任何创建触发器的方法。但是怎么做呢?

尝试使用SqlServerMigrationsSqlGeneratorand SqlServerMigrationsAnnotationProvider,但顾名思义,它们仅在生成 SQL 命令期间的最后阶段使用。这使得它们在使用迁移时有点“隐藏”。在需要时难以定制并在之后进行维护。

考虑使用CSharpMigrationOperationGenerator这似乎非常适合我的需求。但是有一个问题 - 我无法访问这个类。也不是命名空间。

根据来源,此类驻留在Microsoft.EntityFrameworkCore.Migrations.Design命名空间中并且是公共的。为了访问它Microsoft.EntityFrameworkCore.Design,必须安装一个包。

但它不起作用。

我在这里缺少什么?如何访问和继承这个类?或者也许有更好和正确的方法在特定表的迁移期间自动创建触发器?

c# sql-server entity-framework-core asp.net-core entity-framework-migrations

4
推荐指数
3
解决办法
2773
查看次数