Hax*_*Hax 2 .net c# entity-framework-core
我正在使用context.Database.EnsureCreated();考虑 Mac OS 上的实体来自动映射和创建表。但是,它不会为新创建的新实体创建新表。
当我运行以下代码时,我在数据库中看到 3 个表。但是当我添加Battle.cs和取消注释时 -
public DbSet<Battle> Battles { get; set; }
Run Code Online (Sandbox Code Playgroud)
在 中DbContext,context.Database.EnsureCreated();调用不会Battle在数据库中创建表。
楷模 -
public DbSet<Battle> Battles { get; set; }
Run Code Online (Sandbox Code Playgroud)
数据库上下文-
public class Samurai
{
public Samurai()
{
Quotes = new List<Quote>();
}
public int Id { get; set; }
public string Name { get; set; }
public List<Quote> Quotes { get; set; }
public Clan Clan { get; set; }
}
public class Clan
{
public int Id { get; set; }
public string ClanName { get; set; }
}
public class Quote
{
public int Id { get; set; }
public string Text { get; set; }
public Samurai Samurai { get; set; }
public int SamuraiId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
该Battle模型 -
public class SamuraiContext : DbContext
{
public DbSet<Samurai> Samurais { get; set; }
public DbSet<Quote> Quotes { get; set; }
public DbSet<Clan> Clans { get; set; }
// public DbSet<Battle> Battles { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL(@"Server=localhost;port=3306;Database=exercise;Uid=root;Pwd=password;allowPublicKeyRetrieval=true;");
base.OnConfiguring(optionsBuilder);
}
}
Run Code Online (Sandbox Code Playgroud)
程序 -
public class Battle
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime StartDate { get; set;}
public DateTime EndDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
正如杰里米评论的那样,EnsureCreated()根本没有做你想做的事。从文档页面:
确保上下文的数据库存在。如果存在,则不 采取任何操作。如果它不存在,则创建数据库及其所有模式。如果数据库存在,则不会做出任何努力来确保它与此上下文的模型兼容。
EnsureCreated()例如,如果您要在内存 SQLite 数据库上进行集成测试,那么这非常有用。
通常,您希望通过运行 为当前模型生成架构dotnet ef migrations add <MigrationName>,然后如果您想以编程方式确保数据库反映当前架构,请调用database.Migrate()。当然你也可以dotnet ef database update从cli调用。
也就是说,如果您正在使用某种一次性数据库,并且您根本不想为生成架构或迁移而烦恼,那么......
database.EnsureDeleted();
database.EnsureCreated();
Run Code Online (Sandbox Code Playgroud)
...应该可以正常工作,因为这些Ensure*方法不依赖于迁移。
(我只是通过向 a 添加一个额外的实体DbContext,然后调用EnsureDeleted()后跟EnsureCreated(),而没有事先迁移来测试它,它确实重新创建了数据库,并为新实体提供了一个表。)
如果您还有其他问题,请随时发表评论,我会解决它们。:)
| 归档时间: |
|
| 查看次数: |
2888 次 |
| 最近记录: |