尝试创建ASP.NET MVC 4控制器时出现FileNotFound异常

时间:2011-12-27 01:44:42

标签: c# asp.net-mvc sql-server-2008 ef-code-first

我尝试关注Contoso University tutorial,仅使用SQL Server 2008而不是CE。我可以使用我的PC名称和Windows身份验证连接到SQL Server Management Studio中的数据库引擎。我还没有用它创建数据库,因为我试图使用EF Code First。

这是我的连接字符串:

<add 
      name="SchoolContext" 
      connectionString="Data Source=CARSON-PC\CARSON;Integrated Security=true" 
      providerName="System.Data.SqlClient"/>

我尝试通过右键单击controllers文件夹并选择Add->Controller...并根据教程设置生成的对话框来添加控制器。我结束了一个对话框告诉我抛出了FileNotFoundException,该文件是一个临时的dll:

FileNotFoundException while compiling transformation code

此对话框被抛出五次(我假设每个生成的模板文件一次),我最终得到一个控制器,但没有生成模板。

我怀疑它与我的连接字符串或我的SQL服务器安装有关,因为我已经停留了一段时间,在此阶段遇到各种错误,因为我尝试获取连接字符串右。

为了完整起见,这是我试图为以下项目生成控制器的模型:

public class Student {
    public int StudentID { get; set; }
    public string LastName { get; set; }
    public string FirstMidName { get; set; }
    public DateTime EnrollmentDate { get; set; }
    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

上下文:

public class SchoolContext : DbContext {
    public DbSet<Student> Students { get; set; }
    public DbSet<Enrollment> Enrollments { get; set; }
    public DbSet<Course> Courses { get; set; }

    protected override void OnModelCreating(modelBuilder As DbModelBuilder) {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

我的连接字符串错了吗?这是服务器未正确配置的症状吗?我搞砸了什么?

2 个答案:

答案 0 :(得分:2)

这是MVC模板文件List.tt,Edit.tt,Details.tt等中的一个简单错误。对ColumnAttribute有一个含糊不清的引用。

我打开C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC 4\CodeTemplates\AddView\CSHTML,浏览每个.tt文件并搜索“ColumnAttribute”(开头的空格):

//...
var column = attribute as ColumnAttribute;
if (column != null && column.IsPrimaryKey) {  // LINQ to SQL
    return true;
}
//...

我将第一行更改为:

var column = attribute as System.Data.Linq.Mapping.ColumnAttribute;

我认为只有Empty.tt没有它。我为VB模板做了同样的事情。现在控制器创建得很好。

答案 1 :(得分:2)

我刚刚使用ASP.NET MVC 4,SQL SERVER 2008 Express对此进行了测试。每件事都有效。您需要在连接字符串中提供数据库名称,如果您在global.asax中有此类型代码,则EF使用该字符串自动创建具有此名称的数据库,

System.Data.Entity.Database.SetInitializer(new CreateDatabaseIfNotExists<SchoolContext>());

这是我的连接字符串

<add name="SchoolContext" connectionString="Data Source=.\SQlEXPRESS;Initial Catalog=SchoolDatabase;Integrated Security=True;Pooling=False"  providerName="System.Data.SqlClient" />

确保,

使用前构建应用程序。

尝试以管理员身份运行该应用程序。

您最初不需要创建SchoolContext,向导会自动为您创建一个。

查找连接字符串的一种简单方法是使用服务器资源管理器。