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)
-
0
Hi cleverplatform, Can you provide the code for the entity
Book
? -
0
Hi, here are details - also i simulated it again today with a new version CLI 4.2.2, putting again detailed steps:
CMD: abp new BookStore
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)
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); } } } )
add migration using -> Add-Migration "books" + Update-Database - migration applied succesfully in migration folder and also into database
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.'
-
1
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
-
0
are you using tenant per database model?
-
0
Hi - no - im not using one shared database for all tenants erik
-
0
Thanks a lot for your great explanations. I created an issue: https://github.com/abpframework/abp/issues/8019
-
0
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.