ไม่สามารถสร้างการโยกย้ายหลังจากอัปเกรดเป็น ASP.NET Core 2.0


109

หลังจากอัปเกรดเป็น ASP.NET Core 2.0 ดูเหมือนว่าฉันจะสร้างการย้ายข้อมูลไม่ได้อีกต่อไป

ฉันได้รับ

"เกิดข้อผิดพลาดขณะเรียกเมธอด 'BuildWebHost' ในคลาส 'Program' ดำเนินการต่อโดยไม่มีผู้ให้บริการแอปพลิเคชันข้อผิดพลาด: เกิดข้อผิดพลาดอย่างน้อยหนึ่งรายการ (ไม่สามารถเปิดฐานข้อมูล" ... "ที่ร้องขอโดยการเข้าสู่ระบบการเข้าสู่ระบบล้มเหลวในการเข้าสู่ระบบ ล้มเหลวสำหรับผู้ใช้ "... " "

และ

"ไม่สามารถสร้างออบเจ็กต์ประเภท 'MyContext' ได้เพิ่มการใช้งาน 'IDesignTimeDbContextFactory' ในโปรเจ็กต์หรือดู https://go.microsoft.com/fwlink/?linkid=851728สำหรับรูปแบบเพิ่มเติมที่รองรับในขณะออกแบบ"

คำสั่งที่ฉันใช้ก่อนหน้านี้คือ$ dotnet ef migrations add InitialCreate --startup-project "..\Web"(จากโปรเจ็กต์ / โฟลเดอร์ที่มี DBContext)

สตริงการเชื่อมต่อ: "Server=(localdb)\\mssqllocaldb;Database=database;Trusted_Connection=True;MultipleActiveResultSets=true"

นี่คือ Program.cs ของฉัน

 public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
       WebHost.CreateDefaultBuilder(args)
           .UseStartup<Startup>()
           .Build();
}

3
อาจเป็นไปได้ว่าปัญหาไม่ได้อยู่ใน Program.cs อาจเป็นการใช้คำสั่งในการโหลดข้อมูล seed ที่ส่วนท้ายของวิธีการกำหนดค่าของคุณ: DbInitializer เริ่มต้น (บริบท); หากคุณมีคำแนะนำนั้นให้แสดงความคิดเห็นที่ จากนั้นเรียกใช้คำแนะนำการย้ายข้อมูลเพื่อทดสอบ หากปัญหาเกิดขึ้นให้ติดตามคลาส DbInitializer.cs
Miguel Torres C

1
คลาส MyContext ของคุณอยู่ในโปรเจ็กต์ไลบรารีคลาสอื่นหรือไม่
Orhun

ปัญหาเดียวกันที่นี่บริบทอยู่ในไลบรารีอื่น หาก id เพิ่มตัวสร้างพารามิเตอร์ให้น้อยลงในบริบทการย้ายจะทำงาน แต่มีข้อผิดพลาดเดียวกัน: (เกิดข้อผิดพลาดขณะเรียกเมธอด 'BuildWebHost' ในคลาส 'โปรแกรม' ดำเนินการต่อโดยไม่มีผู้ให้บริการแอปพลิเคชันข้อผิดพลาด: ไม่ได้ตั้งค่าการอ้างอิงวัตถุ ไปยังอินสแตนซ์ของวัตถุ)
iBoonZ

คุณได้รับการแก้ไขในที่สุดหรือไม่?
Konrad Viltersten

@MiguelTorresC ขอบคุณสำหรับความคิดเห็นนั้น ฉันแสดงความคิดเห็นเกี่ยวกับวิธีการเพาะเมล็ดและการย้ายข้อมูลของฉันเริ่มได้ผลอีกครั้ง ขอบคุณมาก !!!
Amit Philips

คำตอบ:


123

คุณสามารถเพิ่มคลาสที่ใช้ IDesignTimeDbContextFactory ภายในโครงการเว็บของคุณ

นี่คือโค้ดตัวอย่าง:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<CodingBlastDbContext>
{
    public CodingBlastDbContext CreateDbContext(string[] args)
    {
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();
        var builder = new DbContextOptionsBuilder<CodingBlastDbContext>();
        var connectionString = configuration.GetConnectionString("DefaultConnection");
        builder.UseSqlServer(connectionString);
        return new CodingBlastDbContext(builder.Options);
    }
}

จากนั้นไปที่โครงการฐานข้อมูลของคุณและเรียกใช้สิ่งต่อไปนี้จากบรรทัดคำสั่ง:

dotnet ef migrations add InitialMigration -s ../Web/

dotnet ef database update -s ../Web/

-s stands for startup project and ../Web/ is the location of my web/startup project.

ทรัพยากร


2
ฉันได้รับ: ไม่พบไฟล์คอนฟิกูเรชัน 'appsettings.json' และไม่ใช่ทางเลือก เส้นทางฟิสิคัลคือ 'C: \ Users \ XXX \ Documents \ Visual Studio 2017 \ Projects \ XXX \ src \ XXX Api \ bin \ Debug \ netcoreapp2.0 \ appsettings.json' การตั้งค่าแอปของฉันอยู่ใน C: \ Users \ XXX \ Documents \ Visual Studio 2017 \ Projects \ XXX \ src \ XXX Api
Reft

ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าไฟล์ appsettings.json ให้คัดลอกในเครื่องแล้วควรแก้ไขปัญหาโดยไม่พบ
DaImTo

1
โซลูชันนี้แนะนำการพึ่งพา Entity Framework ในแอปพลิเคชันโฮสต์ของคุณ (ในกรณีของฉันนี่คือโครงการเว็บ) มีวิธีใดบ้างที่จะหลีกเลี่ยงสิ่งนี้? ฉันต้องการให้ไลบรารี Repository เก็บข้อมูล EF ไว้และไม่แนะนำ EF ในเว็บแอป
Banoona

แม้จะเป็นคำตอบที่ยอมรับ แต่อันนี้ดีกว่า: stackoverflow.com/a/52671330/1737395อันที่จริงการรันการย้ายข้อมูลด้วย --verbose flag ช่วยได้มาก
barbara.post

73

ไม่จำเป็นต้องIDesignTimeDbContextFactory.

วิ่ง

add-migration initial -verbose

ที่จะเปิดเผยรายละเอียดภายใต้

เกิดข้อผิดพลาดขณะเข้าถึง IWebHost ในคลาส 'Program' ดำเนินการต่อโดยไม่มีผู้ให้บริการแอปพลิเคชัน

คำเตือนซึ่งเป็นรากสาเหตุของปัญหา

ในกรณีของฉันปัญหาคือการมีApplicationRole : IdentityRole<int>และการเรียกใช้services.AddIdentity<ApplicationUser, IdentityRole>()ซึ่งทำให้เกิดข้อผิดพลาดด้านล่าง

System.ArgumentException: GenericArguments[1], 'Microsoft.AspNetCore.Identity.IdentityRole', 
on 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`9[TUser,TRole,TContext,
TKey,TUserClaim,TUserRole,TUserLogin,TUserToken,TRoleClaim]' violates the constraint of type 'TRole'.
---> System.TypeLoadException: GenericArguments[1], 'Microsoft.AspNetCore.Identity.IdentityRole', 
on 'Microsoft.AspNetCore.Identity.UserStoreBase`8[TUser,TRole,TKey,TUserClaim,
TUserRole,TUserLogin,TUserToken,TRoleClaim]' violates the constraint of type parameter 'TRole'.

3
ใช่ -Verbose ช่วยในการค้นพบปัญหาที่แท้จริง ในกรณีของฉันยังไม่ได้เพิ่มบริการ AddDbContext เพื่อเริ่มต้น
sudhakarssd

3
dotnet ef migrations เพิ่ม InitialCreate --verbose
barbara.post

4
@tchelidze ขอบคุณสำหรับสิ่งนั้นในกรณีของฉันฉันไม่มีตัวสร้างแบบไม่มีพารามิเตอร์ใน ApplicationDbContext ของฉัน
Tiago Ávila

1
นี่เป็นเคล็ดลับที่ยอดเยี่ยมควรเป็นคำตอบที่ยอมรับ
Avrohom Yisroel

1
ขอบคุณมากสิ่งนี้ช่วยให้ฉันพบปัญหาและแก้ไขได้ ในกรณีของฉันมันเป็น "ไม่มีตัวสร้างที่ไม่มีพารามิเตอร์ที่กำหนดไว้สำหรับประเภท 'Data.Access.DAL.MainDbContext'" ดังนั้นฉันจึงเพิ่งลบพารามิเตอร์ออกจากตัวสร้างและมันก็ทำงานได้เหมือนเวทมนตร์!
Sarah

25

โซลูชันที่ 1: (ค้นหาปัญหาใน 99% ของกรณี)

ตั้งค่าโครงการWeb Applicationเป็นStartup Project

รันคำสั่งต่อไปนี้ด้วย-verboseตัวเลือก

Add-Migration Init -Verbose

-verbose ตัวเลือกช่วยในการค้นพบปัญหาที่แท้จริงซึ่งมีข้อผิดพลาดโดยละเอียด

แนวทางที่ 2:

เปลี่ยนชื่อBuildWebHost()เป็นCreateWebHostBuilder()เพราะEntity Framework Core toolsคาดว่าจะพบCreateHostBuilderวิธีการที่กำหนดค่าโฮสต์โดยไม่ต้องเรียกใช้แอป

.NET Core 2.2

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
} 

.NET Core 3.1

เปลี่ยนชื่อBuildWebHost()เป็นCreateHostBuilder()

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

แนวทางที่ 3:

ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มDbcontextในการฉีดพึ่งพา: AddDbContext<TContext>จะทำให้ทั้งประเภท DbContext ของคุณTContextและที่เกี่ยวข้องDbContextOptions<TContext>พร้อมสำหรับการฉีดจากที่เก็บบริการ นี้ต้องเพิ่มอาร์กิวเมนต์คอนสตรัคที่คุณชนิดที่ยอมรับDbContextDbContextOptions<TContext>

ตัวอย่าง: ใน Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AppDbContext>(options => options.UseSqlServer(connectionString));
}

รหัสAppDbContext :

public class AppDbContext: DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options)
      :base(options)
    { }

}

1
สิ่งนี้ได้ผลสำหรับฉัน เปลี่ยนฟังก์ชัน BuildWebHost ใน Program.cs จากpublic static IWebHostBuilder BuildWebHost(string[] args)เป็นpublic static IWebHost BuildWebHost(string[] args)พร้อมกับ.Build()ฟังก์ชันที่รวมอยู่ในขณะนี้
zola25

1
พวกถ้าคุณใช้ ASP.NET Core 2.1+ วิธี BuildWebHost ของคุณจะมีชื่อที่แตกต่างกัน - CreateWebHostBuilder เนื่องจากdocs.microsoft.com/en-us/aspnet/core/migration/… ดังนั้นเปลี่ยนชื่อ CreateWebHostBuilder เป็น BuildWebHost และการโยกย้ายจะพบ BuildWebHost และรับ DbContext จากมัน
KEMBL

2
ขอบคุณเพื่อนแก้ไขหลังจากใช้เวลา 2 ชั่วโมงในการกำหนดค่าโดยไม่ต้องใช้IDesignTimeDbContextFactory
Azri Zakaria

3
ขอบคุณสำหรับการตั้งค่าสถานะ "-Verbose" มันช่วยให้ฉันหาสาเหตุของข้อยกเว้นได้
Sergey_T

21
public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
    }
}

เพียงแค่เปลี่ยนชื่อBuildWebHost()เป็นCreateWebHostBuilder()เนื่องจากการย้ายข้อมูลจะใช้วิธีนี้โดยค่าเริ่มต้น


4
อะไร. นี้ควรได้รับการประกาศในการจัดการทุกหน้ากับปัญหานี้คุณร้ายแรง ประสบความสำเร็จทันที ขอบคุณ.
Chaim Eliyah

บันทึกวันของฉัน !!! มันเป็นข้อผิดพลาดที่แปลกมาก ฉันใช้. net core 3.0 พร้อมตัวอย่าง 7 และมีข้อผิดพลาดนี้อยู่
D Todorov


D Todorov เพียงแค่เปลี่ยนชื่อ BuildWebHost () เป็น CreateHostBuilder ()
Ali Bayat

1
@WernerCD Cuz Worker ใช้เมธอด CreateHostBuilder () ที่ใช้ IHostBuilder ของ Net Core 3
sherox

11

ในกรณีของฉันสาเหตุของปัญหาคือโครงการเริ่มต้นหลายโครงการ ฉันมีสามโครงการในโซลูชันของฉัน: Mvc, Api และ Dal DbContext และการโยกย้ายในโครงการ Dal

ฉันได้กำหนดค่าโครงการเริ่มต้นหลายโครงการ ทั้งโครงการ Mvc และ Api กำลังทำงานเมื่อฉันคลิกเริ่ม แต่ในกรณีนี้ฉันได้รับข้อผิดพลาดนี้

"ไม่สามารถสร้างออบเจ็กต์ประเภท 'MyContext' ได้เพิ่มการใช้งาน 'IDesignTimeDbContextFactory' ในโปรเจ็กต์หรือดู https://go.microsoft.com/fwlink/?linkid=851728สำหรับรูปแบบเพิ่มเติมที่รองรับในขณะออกแบบ"

ฉันสามารถเพิ่มการย้ายข้อมูลได้สำเร็จหลังจากตั้งค่า Mvc เป็นโปรเจ็กต์เริ่มต้นระบบเดียวและเลือก Dal ในคอนโซล Package Manager


1
ขอบคุณสิ่งเดียวกันที่เกิดขึ้นกับฉัน ฉันต้องเปลี่ยนโครงการเริ่มต้นไปยังสถานที่ที่มีคลาส Startup / Program อยู่ ข้อความแสดงข้อผิดพลาดเป็นเรื่องตลกร้าย
ĽubošČurgó

1
ข้อความที่ส่งออกนั้นน่าหงุดหงิดจริงๆ ฉันไม่ได้เลือกโครงการเริ่มต้นโดยไม่คาดคิด นี่คือสาเหตุที่ไม่สามารถสร้าง dbContext ได้ ขอบคุณ.
upkit

1
ขอบคุณครับ ... ประหยัดเวลาได้มาก
Naveed Khan

7

ใน AppContext.cs นอกเหนือจากคลาส AppContext ให้เพิ่มคลาสอื่น:

// required when local database deleted
public class ToDoContextFactory : IDesignTimeDbContextFactory<AppContext>
{
    public AppContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<AppContext>();
          builder.UseSqlServer("Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true");
        return new AppContext(builder.Options);
    }
}

วิธีนี้จะแก้ปัญหาที่สองของคุณ:

"ไม่สามารถสร้างวัตถุประเภท 'MyContext' ได้เพิ่มการใช้งาน 'IDesignTimeDbContextFactory' ในโครงการ

หลังจากนั้นคุณจะสามารถเพิ่มการย้ายข้อมูลเริ่มต้นและดำเนินการได้โดยรันคำสั่งupdate-database อย่างไรก็ตามหากเรียกใช้คำสั่งเหล่านี้เมื่อยังไม่มี DataBase ใน SqlServer ในเครื่องของคุณคุณจะได้รับคำเตือนเหมือนกับข้อผิดพลาดแรกของคุณ: "ข้อผิดพลาด

เกิดขึ้นขณะเรียกเมธอด 'BuildWebHost' ในคลาส 'Program' ... การเข้าสู่ระบบล้มเหลว การเข้าสู่ระบบล้มเหลวสำหรับผู้ใช้ "... " "

แต่ไม่ใช่ข้อผิดพลาดเนื่องจากจะมีการสร้างการโยกย้ายและสามารถดำเนินการได้ ดังนั้นให้ละเว้นข้อผิดพลาดนี้เป็นครั้งแรกและหลังจากนั้น Db จะมีอยู่มันจะไม่เกิดขึ้นอีก


4

โปรดตรวจสอบว่าคุณมีข้อมูลอ้างอิง

<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />

5
ฉันกำลังใช้<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />ซึ่งรวมถึงข้อมูลอ้างอิงนั้น ฉันพยายามรวมข้างต้นด้วย แต่ไม่มีการเปลี่ยนแปลง
ruhm

4

คุณสามารถลองวิธีแก้ปัญหานี้ได้จากการสนทนานี้ซึ่งได้รับแรงบันดาลใจจากโพสต์นี้

public static IWebHost MigrateDatabase(this IWebHost webHost)
{
    using (var scope = webHost.Services.CreateScope())
    {
        var services = scope.ServiceProvider;

        try
        {
            var db = services.GetRequiredService<MyContext>();
            db.Database.Migrate();
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while migrating the database.");
        }
    }

    return webHost;
}
public static void Main(string[] args)
{
    BuildWebHost(args)
        .MigrateDatabase()
        .Run();
}

2
ฉันยังคงได้รับ: เพิ่มการใช้งาน 'IDesignTimeDbContextFactory <DatabaseContext>' ......
Reft

4

สิ่งที่ช่วยฉันได้จริงๆคือบทความนี้: https://elanderson.net/2017/09/unable-to-create-an-object-of-type-applicationdbcontext-add-an-implementation-of-idesigntimedbcontextfactory/

แนวคิดพื้นฐานคือในการเปลี่ยนจาก. net core 1 เป็น 2 ควรย้ายการเริ่มต้น db ทั้งหมดออกจาก StartUp.cs และไปยัง Program.cs มิฉะนั้นงาน EF จะพยายามเรียกใช้ DB ของคุณเมื่อทำงาน

"มีส่วนที่ดีในเอกสารการย้ายข้อมูลอย่างเป็นทางการ ( https://docs.microsoft.com/en-us/ef/core/miscellaneous/1x-2x-upgrade ) ที่ชื่อว่า" ย้ายรหัสเริ่มต้นฐานข้อมูล "ซึ่งดูเหมือนว่าฉันจะมี พลาดดังนั้นก่อนที่คุณจะมุ่งหน้าลงโพรงกระต่ายอย่างที่ฉันได้ตรวจสอบให้แน่ใจว่านี่ไม่ใช่สิ่งที่ทำให้คุณต้องเพิ่มการใช้งาน IdesignTimeDbContextFactory "


ขอบคุณสิ่งนี้ช่วยฉันด้วย
Sergey

3

จาก

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation

เมื่อคุณสร้างแอปพลิเคชัน ASP.NET Core 2.0 ใหม่เบ็ดนี้จะรวมไว้โดยค่าเริ่มต้น ในเวอร์ชันก่อนหน้าของ EF Core และ ASP.NET Core เครื่องมือพยายามเรียกใช้ Startup.ConfigureServices โดยตรงเพื่อขอรับผู้ให้บริการของแอปพลิเคชัน แต่รูปแบบนี้ทำงานไม่ถูกต้องในแอปพลิเคชัน ASP.NET Core 2.0 อีกต่อไป หากคุณกำลังอัพเกรดแอปพลิเคชัน ASP.NET Core 1.x เป็น 2.0 คุณสามารถปรับเปลี่ยนคลาส Program ของคุณให้เป็นไปตามรูปแบบใหม่ได้

เพิ่มโรงงานใน. Net Core 2.x

public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
    {
        public BloggingContext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
            optionsBuilder.UseSqlite("Data Source=blog.db");

            return new BloggingContext(optionsBuilder.Options);
        }
    }

3

ฉันมีปัญหานี้และแก้ไขได้โดย Set -> Web Application (Included Program.cs) Project เป็น -> "Set as Startup Project"

จากนั้นเรียกใช้ -> add-migration initial -verbose

ในคอนโซลตัวจัดการแพ็คเกจ

ตั้งเป็นโครงการเริ่มต้น


ขอบคุณทางออกเดียวที่ใช้ได้ผลสำหรับฉันคือตั้งค่าโครงการเว็บเป็นโครงการเริ่มต้นและนั่นคือสิ่งที่ต้องทำ
user3012760

3

หากคุณต้องการหลีกเลี่ยงสิ่งที่ IDesignTimeDbContextFactory: ตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้วิธี Seed ใด ๆ ในการเริ่มต้นของคุณ ฉันใช้วิธีการ seed แบบคงที่ในการเริ่มต้นและทำให้เกิดข้อผิดพลาดนี้สำหรับฉัน


2

ก่อนหน้านี้คุณกำหนดค่าข้อมูลเมล็ดพันธุ์ในวิธีกำหนดค่าใน Startup.cs ตอนนี้ขอแนะนำให้คุณใช้เมธอด Configure เพื่อตั้งค่าไปป์ไลน์คำขอเท่านั้น รหัสเริ่มต้นแอปพลิเคชันอยู่ในวิธีการหลัก

วิธีการปรับโครงสร้างหลัก เพิ่มการอ้างอิงต่อไปนี้ใน Program.cs:

ใช้ Microsoft.Extensions.DependencyInjection;

ใช้ MyProject.MyDbContextFolder;

public static void Main(string[] args)
{
    var host = BuildWebHost(args);

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            var context = services.GetRequiredService<MyDbConext>();
            DbInitializer.Initialize(context);
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the database.");
        }
    }

    host.Run();
}



2

ในกรณีของฉันฉันพบปัญหาเพราะฉันมีเมธอดชื่อSeedData.EnsurePopulated ()ถูกเรียกในไฟล์Startup.csของฉัน

public class Startup
{
    public Startup(IConfiguration configuration) => Configuration = configuration;
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        //
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseDeveloperExceptionPage();
        app.UseStatusCodePages();
        app.UseStaticFiles();
        app.UseSession();
        app.UseMvc(routes =>
        {
            //
        });

        SeedData.EnsurePopulated(app);
    }
}

การทำงานของคลาสSeedDataคือการเพิ่มข้อมูลเริ่มต้นลงในตารางฐานข้อมูล รหัสคือ:

public static void EnsurePopulated(IApplicationBuilder app)
    {
        ApplicationDbContext context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>();
        context.Database.Migrate();
        if (!context.Products.Any())
        {
            context.Products.AddRange(
            new Product
            {
                Name = "Kayak",
                Description = "A boat for one person",
                Category = "Watersports",
                Price = 275
            },
            ....
            );
            context.SaveChanges();
        }
    }

สารละลาย

ก่อนที่จะทำการย้ายข้อมูลให้แสดงความคิดเห็นเกี่ยวกับการเรียกคลาสSeedDataในไฟล์ Startup.cs

// SeedData.EnsurePopulated(app);

นั่นช่วยแก้ปัญหาของฉันและหวังว่าปัญหาของคุณจะได้รับการแก้ไขในลักษณะเดียวกัน


1

ฉันพบปัญหาเดียวกัน ฉันมีสองโครงการในการแก้ปัญหา ที่

  1. API
  2. บริการและ repo ซึ่งถือแบบจำลองบริบท

ในขั้นต้นโครงการ API ถูกตั้งค่าเป็นโครงการเริ่มต้น

ฉันเปลี่ยนโครงการเริ่มต้นเป็นโครงการที่มีคลาสบริบท หากคุณใช้Visual Studioคุณสามารถตั้งค่าโครงการเป็นโครงการเริ่มต้นโดย:

open solution explorer >> คลิกขวาที่ context project >> เลือก Set as Startup project


1

ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณได้กำหนดค่าฐานข้อมูลของคุณในStartup.cs กรณีของฉันฉันได้รับข้อผิดพลาดนี้เนื่องจากฉันไม่ได้ระบุด้านล่างในStartup.cs

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection"), x => x.MigrationsAssembly("<Your Project Assembly name where DBContext class resides>")));

1

การใช้ ASP.NET Core 3.1 และ EntityFrameWorkCore 3.1.0 การแทนที่ OnConfiguring ของคลาสบริบทด้วยคอนสตรัคเตอร์แบบไม่มีพารามิเตอร์เท่านั้น

```protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json")
               .Build();
            var connectionString = configuration.GetConnectionString("LibraryConnection");
            optionsBuilder.UseSqlServer(connectionString);
        }
    }
```

1

ฉันพบข้อผิดพลาด

"ไม่สามารถสร้างออบเจ็กต์ประเภท 'MyContext' ได้เพิ่มการใช้งาน 'IDesignTimeDbContextFactory' ในโปรเจ็กต์หรือดูhttps://go.microsoft.com/fwlink/?linkid=851728สำหรับรูปแบบเพิ่มเติมที่รองรับในขณะออกแบบ"

นี่คือวิธีแก้ปัญหาของฉัน เรียกใช้คำสั่งด้านล่างในขณะที่คุณอยู่ในไดเร็กทอรีโซลูชันของคุณ

 dotnet ef migrations add InitialMigration --project "Blog.Infrastructure" --startup-project "Blog.Appication"

ที่นี่แอปพลิเคชันคือโครงการเริ่มต้นของฉันที่มีคลาส Startup.cs & โครงสร้างพื้นฐานเป็นโครงการของฉันที่มีคลาส DbContext

จากนั้นเรียกใช้การอัปเดตโดยใช้โครงสร้างเดียวกัน

dotnet ef database update --project "Blog.Infrastructure" --startup-project "Blog.Application"

0

ฉันได้รับปัญหาเดียวกันเนื่องจากฉันอ้างถึง Microsoft.EntityFrameworkCore.Tools.DotNet แบบเก่า

<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />

หลังจากอัปเกรดเป็นเวอร์ชันที่ใหม่กว่าได้รับการแก้ไขแล้ว


0

ในไฟล์ appsettings.json ของโปรเจ็กต์หลักฉันได้ตั้งค่า 'คัดลอกไปยังไดเรกทอรีผลลัพธ์' เป็น "คัดลอกเสมอ" และมันก็ใช้ได้


0

คลาสบริบท DB ตัวอย่างสำหรับแอ็พพลิเคชันคอนโซล. net core

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System.IO;

namespace EmailServerConsole.Data
{
    public class EmailDBContext : DbContext
    {
        public EmailDBContext(DbContextOptions<EmailDBContext> options) : base(options) { }
        public DbSet<EmailQueue> EmailsQueue { get; set; }
    }

    public class ApplicationContextDbFactory : IDesignTimeDbContextFactory<EmailDBContext>
    {
        EmailDBContext IDesignTimeDbContextFactory<EmailDBContext>.CreateDbContext(string[] args)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();
            var builder = new DbContextOptionsBuilder<EmailDBContext>();
            var connectionString = configuration.GetConnectionString("connection_string");
            builder.UseSqlServer(connectionString);
            return new EmailDBContext(builder.Options);
        }
    }
}

แม้ว่าสิ่งนี้อาจตอบคำถามของผู้เขียน แต่ก็ไม่มีคำอธิบายและลิงก์ไปยังเอกสารประกอบ ข้อมูลโค้ดดิบจะไม่เป็นประโยชน์หากไม่มีวลีบางอย่างอยู่รอบ ๆ คุณอาจพบวิธีเขียนคำตอบที่ดีซึ่งมีประโยชน์มาก โปรดแก้ไขคำตอบของคุณ
hellow

0

คุณยังสามารถใช้ในตัวสร้างคลาสเริ่มต้นเพื่อเพิ่มไฟล์ json (โดยที่สตริงการเชื่อมต่ออยู่) ในคอนฟิกูเรชัน ตัวอย่าง:

    IConfigurationRoot _config;
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json");

        _config = builder.Build();
    }

0

สำหรับฉันมันเป็นเพราะผมเปลี่ยนOutput Typeของโครงการเริ่มต้นของฉันจากไปConsole ApplicationClass Library

กลับไปConsole Applicationทำเคล็ดลับ


0

ฉันมีปัญหานี้ในวิธีแก้ปัญหาที่มี:

  • โครงการ. NET Core 2.2 MVC
  • โครงการ. NET Core 3.0 Blazor
  • บริบท DB ในโครงการไลบรารีคลาส. NET Standard 2.0

ฉันได้รับข้อความ "ไม่สามารถสร้างอ็อบเจ็กต์ ... " เมื่อโปรเจ็กต์ Blazor ถูกตั้งค่าเป็นโปรเจ็กต์เริ่มต้น แต่ไม่ใช่ถ้าโปรเจ็กต์ MVC ถูกตั้งค่าเป็นโปรเจ็กต์เริ่มต้น

นั่นทำให้ฉันสับสนเพราะในคอนโซล Package Manager (ซึ่งเป็นที่ที่ฉันสร้างการย้ายข้อมูล) ฉันมีโปรเจ็กต์เริ่มต้นที่ตั้งค่าเป็นไลบรารีคลาส C # ที่มีบริบท DB และฉันยังระบุบริบท DB ใน ฉันเรียกร้องให้เพิ่มการโยกย้าย add-migration MigrationName -context ContextNameดังนั้นจึงดูเหมือนแปลกที่ Visual Studio จะสนใจว่าโครงการเริ่มต้นระบบตั้งค่าไว้ในปัจจุบัน

ฉันคาดเดาเหตุผลก็คือเมื่อโครงการ Blazor เป็นโครงการเริ่มต้น PMC กำลังกำหนดเวอร์ชันของ. NET เป็น Core 3.0 จากโครงการเริ่มต้นจากนั้นพยายามใช้สิ่งนั้นเพื่อเรียกใช้การย้ายข้อมูลบนคลาส. NET Standard 2.0 ไลบรารีและกดปุ่มข้อขัดแย้งบางประเภท

ไม่ว่าจะเกิดจากสาเหตุใดการเปลี่ยนโครงการเริ่มต้นเป็นโครงการ MVC ที่กำหนดเป้าหมายไปที่ Core 2.2 แทนที่จะเป็นโครงการ Blazor จะแก้ไขปัญหาได้


0

สำหรับฉันปัญหาคือฉันเรียกใช้คำสั่งการย้ายข้อมูลภายในโปรเจ็กต์ที่ไม่ถูกต้อง การรันคำสั่งภายในโปรเจ็กต์ที่มี Startup.cs แทนที่จะเป็นโปรเจ็กต์ที่มี DbContext ทำให้ฉันสามารถผ่านพ้นปัญหานี้ไปได้


0

ในกรณีของฉันการตั้งค่าโครงการ StartUp ใน init ช่วยได้ คุณสามารถทำได้โดยดำเนินการ

dotnet ef migrations add init -s ../StartUpProjectName

-4

ฉันมีปัญหาเดียวกัน เพิ่งเปลี่ยน ap.jason เป็น application.jason และแก้ไขปัญหาได้แล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.