Open Closed

The entity type 'TenantConnectionString' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'. For more information on keyless entity types #996


User avatar
0
cleverplatform created

Check the docs before asking a question: https://docs.abp.io/en/commercial/latest/ Check the samples, to see the basic tasks: https://docs.abp.io/en/commercial/latest/samples/index The exact solution to your question may have been answered before, please use the search on the homepage.

  • ABP Framework version: v4.2.1

  • UI type: MVC

  • DB provider: EF Core

  • Tiered (MVC) or Identity Server Separated (Angular): no

  • Exception message and stack trace:

  • System.InvalidOperationException: 'The entity type 'TenantConnectionString' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.'

  • This exception was originally thrown at this call stack: [External Code] XXX.XXXSeed.SeedAsync(Volo.Abp.Data.DataSeedContext) in XXXSeed.cs [External Code] XXX.Data.ShopSplitterDbMigrationService.SeedDataAsync(Volo.Saas.Tenants.Tenant) in XXXDbMigrationService.cs [External Code] XXXData.XXXDbMigrationService.MigrateAsync() in XXXDbMigrationService.cs [External Code] XXX.DbMigrator.DbMigratorHostedService.StartAsync(System.Threading.CancellationToken) in DbMigratorHostedService.cs [External Code] ShopSplitter.DbMigrator.Program.Main(string[]) in Program.cs ... [Call Stack Truncated]

  • Steps to reproduce the issue:

  • create project with "abp new XXX"

  • build solution in VS and execute XXX.DBMigration - initial migration were created

  • run solution / login / logout /close app

  • in solution create a new entity "Book" and create add-migration and update-database - new entity was added into Migration and into database

  • create seed for a new entity "Book" in Domain project and have only this code public async Task SeedAsync(DataSeedContext context) { using (_currentTenant.Change(context?.TenantId)) { if (await _bookRepository.GetCountAsync() > 0) { return; } } }

  • run XXX.DBMigration and on method _bookRepository.GetCountAsync is logged error: System.InvalidOperationException: 'The entity type 'TenantConnectionString' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.'

Could you investigate that - I simulated that 3 times in separated project from scratch thanks Erik


7 Answer(s)
  • User Avatar
    0
    Moyaoxiang created

    Hi cleverplatform, Can you provide the code for the entity Book?

  • User Avatar
    0
    cleverplatform created

    Hi, here are details - also i simulated it again today with a new version CLI 4.2.2, putting again detailed steps:

    1. CMD: abp new BookStore

    2. open solution BookStore.sln in VS -> rebuild -> run BookStore.DbMigrator - all ok - initial migration has been created + database created in SQL server (SQL Server 2014)

    3. created Book entity in domain + add into db.context + add additional information into BookStoreDbContextModelCreatingExtensions about book entity + created BookSeed (all changes in code i put below) :

      • Book Class: public class Book : FullAuditedAggregateRoot<Guid>, IMultiTenant { public Guid? TenantId { get; set; } [CanBeNull] public Tenant Tenant { get; set; } public string StoreName { get; set; } [Column(TypeName = "nvarchar(4000)")] public string Description { get; set; } [Column(TypeName = "nvarchar(MAX)")] public string Html { get; set; } protected Book() { } public Book(string storeName, Guid? tenantId) { StoreName = storeName; TenantId = tenantId; } }

      • added in BookStoreDbContext.cs: public DbSet<Book> Books { get; set; }

      • BookStoreConsts: public static class BookStoreConsts { public const string DbTablePrefix = "App"; public const string DbSchema = "bookstore"; }

      • added in BookStoreDbContextModelCreatingExtensions.cs builder.Entity<Book>(b => { b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema); b.ConfigureByConvention(); });

      • BooksSeed in Domain: public class BooksSeed : IDataSeedContributor,ITransientDependency { private readonly IRepository<Book, Guid> _bookRepository; public BooksSeed(IRepository<Book, Guid> bookRepository) { _bookRepository = bookRepository; } public async Task SeedAsync(DataSeedContext context) { if (await _bookRepository.GetCountAsync() <= 0) { //await _bookRepository.InsertAsync(new Book("book_name", null), autoSave: true); } } } )

    4. add migration using -> Add-Migration "books" + Update-Database - migration applied succesfully in migration folder and also into database

    5. run BookStore.DbMigrator - for applying a new BookSeed -> error occured:

    System.InvalidOperationException: 'The entity type 'TenantConnectionString' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.'

  • User Avatar
    1
    cleverplatform created

    Hi not sure if you have any progress with this issue but i found possible solution by using this fragment in "XXXDbContextModelCreatingExtensions.cs"

        builder.Entity<TenantConnectionString>().HasKey(lc => new { lc.TenantId, lc.Name});
        
    

    could you pls. confirm if that is posible solution? or it is an issue on framework side, or should I set something differently.

    thanks, let me know Erik

  • User Avatar
    0
    alper created
    Support Team Director

    are you using tenant per database model?

  • User Avatar
    0
    cleverplatform created

    Hi - no - im not using one shared database for all tenants erik

  • User Avatar
    0
    berkansasmaz created
    Support Team .NET Developer

    Thanks a lot for your great explanations. I created an issue: https://github.com/abpframework/abp/issues/8019

  • User Avatar
    0
    berkansasmaz created
    Support Team .NET Developer

    You can find why the problem occurs and the solution here.

    So I am closing this ticket. You can re-open and add comment if you want.

Made with ❤️ on ABP v8.2.0-preview Updated on March 25, 2024, 15:11