MVC 4和EF6数据库第一:映射问题

时间:2014-01-20 12:44:24

标签: c# entity-framework asp.net-mvc-4 entity-framework-6 ef-database-first

我跟随Adam Freeman在VS 2010上的Pro ASP.NET MVC 4(我在线下载了MVC 4模板)。我之前使用过.edmx文件,但是在第7章他没有这样做。我在我的webUI项目中的web.config文件中设置了一个带有SQL Server的基本连接字符串,我的控制器和视图位于该文件中。另外,我在下面的Domain项目中列出了我的Domain类。当我运行应用程序时出现问题。应用程序无法在我的数据库中识别我的表(dbo.Request),而是在Entities命名空间中创建一个基于我的类名的表(因此它创建了一个CustRequest表),并且它还创建了一个_Migration_History表。为了防止这种情况,我在我的类[Table(“MyTableName”)]上面添加了数据注释。我无法弄清楚为什么我必须添加此数据注释。另外,EF让我在我的主键上方添加了一个[Key],我可以理解,因为我没有ID属性,但在书中他并没有这样做。我想知道我是否遗漏了一些明显的东西,因为我对MVC很新。任何帮助,将不胜感激。我正在使用EF 6.谢谢。

    namespace Requestor.Domain.Entities
    {
        [Table("Request")]
        public class CustRequest
        {
            [Key]
            public int RequestId { get; set; }
            public string RequestByUserCd { get; set; }
            public DateTime RequestDateTime { get; set; }
            public DateTime DueDate { get; set; }
        }
    }

    namespace Requestor.Domain.Abstract
    {
        public interface ICustRequestRepository
        {
            IQueryable<CustRequest> Request { get; }
        }
    }

    namespace ITRequestHub.Domain.Concrete
    {
        public class EFDbContext : DbContext
        {
            public DbSet<CustRequest> Request { get; set; }
        }
    }


    namespace ITRequestHub.Domain.Concrete
    {
        public class EFCustRequestRepository : ICustRequestRepository
        {
            private EFDbContext context = new EFDbContext(); //retrieves the data

            public IQueryable<CustRequest> Request
            {
                get { return context.Request; }
            }
        }
    }    

2 个答案:

答案 0 :(得分:1)

如果可以的话,请考虑再次尝试使用 EF5 ,在尝试使EF6与MVC4一起工作时我遇到了类似的问题(我也无法使脚手架工作)。

或者一直到最新版本的所有内容并尝试 MVC5与EF6 (这似乎工作正常)

答案 1 :(得分:0)

你已经遇到了EF及其惯例的美妙而有时令人沮丧的部分。当您在简化生活时意识到这些惯例时会很精彩,但如果您觉得框架在未经您明确许可的情况下执行任务时会感到沮丧。

首先,可以在此处找到有关EF6约定的其他信息:http://msdn.microsoft.com/en-gb/data/jj679962.aspx

关于你的第一点,据我所知,EF将你的实体名称作为它将在你的数据库中创建的表的名称。正如您所发现的那样,您可以通过“Table”属性控制它,但您也可以控制它希望在创建表时通过DbContext中的约定删除来复制实体名称

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>()

关于第二点,我无法想象您需要在“RequestId”字段附加“Key”属性。这里的约定是,如果字段名称包含ID后缀(不区分大小写),则EF将自动将其作为主键包含,如果字段的类型是Int或Guid,则它将自动设置为自动种子标识列。