我正在研究代码优先的Entity Framework 6.2项目。 (我使用的是PostgreSQL 10.9.2。)在测试中,我使用的是DropCreateDatabaseAlways
初始化程序。我试图让一个用户(在postgres中为“ role”)将项目添加到表中,然后让另一个用户将项目添加到同一表中。但是,当第二个用户尝试写入表时,出现异常。错误状态:
“ 42501:必须是数据库MyTestDb的所有者。”
该异常还包括有问题的SQL语句,即“ {DROP DATABASE“ MyTestDb”}“。显然,EF6正在第二次尝试删除/创建数据库。
这是预期的行为吗?我以为DropCreateDatabaseAlways
只会在第一次创建关联的DbContext
对象时删除/创建数据库。 (据我所知,在我的app.config中没有任何时髦的东西会引起这种情况。)
我将代码精简为要点,如下所示:
using System.Data.Entity;
namespace DbInitTest
{
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new DropCreateDatabaseAlways<ThingContext>());
using (var context = new ThingContext("Server=localhost;Port=5432;User Id=postgres;Password=blah;Database=MyTestDb"))
{
context.Things.Add(new Thing { Name = "Name1" });
context.SaveChanges();
}
using (var context = new ThingContext("Server=localhost;Port=5432;User Id=nonRootUser;Password=blah;Database=MyTestDb"))
{
context.Things.Add(new Thing { Name = "Name2" });
context.SaveChanges();
}
}
}
public class Thing
{
public int ThingId { get; set; }
public string Name { get; set; }
}
public class ThingContext : DbContext
{
public ThingContext(string connString) : base(connString) { }
public DbSet<Thing> Things { get; set; }
}
}