11

我正在使用 ASP.NET MVC 4 - c# 连接到实时数据库,并列出结果,但是当我查看该页面时,它返回以下错误:

CREATE TABLE permission denied in database 'DatabaseName'.

Description: An unhandled exception occurred during the execution
of the current web request. Please review the stack trace for more
information about the error and where it
originated in the code.



Exception Details: System.Data.SqlClient.SqlException: CREATE TABLE
permission denied in database 'DatabaseName'.

Source Error: 


Line 16:         public ActionResult Index()
Line 17:         {
Line 18:             return View(db.AccControls.ToList());
Line 19:         }
Line 20

控制器:

namespace TestDBCon.Controllers
{
    public class HomeController : Controller
    {
        private DataDbContext db = new DataDbContext();

        public ActionResult Index()
        {
            return View(db.AccControls.ToList());
        }

    }
}

AccControl.cs(模型)

namespace TestDBCon.Models
{
    public class AccControl
    {
        public int ID { get; set; }
        public int ControlCode { get; set; }
        public string Nominal { get; set; }
        public string CostCentre { get; set; }
        public string Department { get; set; }
    }

    public class DataDbContext : DbContext
    {
        public DbSet<AccControl> AccControls { get; set; }
    }
}

网络配置:

<add name="DataDbContext" connectionString="Data Source=***;initial catalog=***;integrated security=True;" providerName="System.Data.SqlClient" />

我不是想创建一个表?我只是想列出结果,所以我非常困惑。它必须与MVC有关吗?

任何帮助将不胜感激!

谢谢

4

3 回答 3

23

我知道它已经过时了,但由于我遇到了同样的问题,而且我花了一段时间才找到解决方案……我决定分享这些信息。所以我必须做两件事来解决这个问题,第一是禁用迁移:

# Migrations/Configuration.cs
internal sealed class Configuration : DbMigrationsConfiguration<IntranetApplication.Models.MyDb1>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }
}

然而这还不够,我还必须确保播种机不运行。您可以使用这段额外的代码取消它:

#Global.asax.cs
protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    Database.SetInitializer<Models.MyDb1>(null);
    Database.SetInitializer<Models.MyDb2>(null);

    ...
}

然后最后我现在可以使用 LINQ 执行 SELECT 并且只有读取访问权限

EDIT
根据 Lawrence 的建议,最好将它直接放在 DB Context Constructor 中。感谢您的提示,我更新了代码,现在看起来像这样:

public partial class MyDb1 : DbContext
{
    public MyDb1()
        : base("name=MyDb1Connection")
    {
        Database.SetInitializer<Models.MyDb1>(null);
    }

    ...
}
于 2014-02-04T22:02:16.253 回答
3

您是否web config指向正确的数据库?

凭证是否正确?

如果您要使用实体框架MVC4 WebSecutiy()来处理用户的身份验证和授权,实体框架将在数据库中创建表。这可能会引发异常。

在这种情况下,您无法创建成员资格提供者所需的表,您需要将其从系统中排除。在这里看到这个。或者,创建一个新的 MVC4 项目并选择空模板,然后放入您需要的位。

于 2013-02-06T11:06:14.523 回答
0

在重构和重命名一些代码后,我遇到了类似的错误。问题是我的 C# 代码与数据库中的表名不匹配。

我在 C# 中的代码:

public virtual DbSet<MyTableName>

以及 SQL Server 中的表名:

MyActualTableName

由于表名不匹配(MyTableName != MyActualTableName),我得到了这个(误导性)错误:

Create TABLE permission denied in database MyDatabase

我花了一段时间才看到我搞砸了,但匹配表名解决了错误。

于 2019-06-14T16:49:21.997 回答