【发布时间】:2011-08-14 00:56:56
【问题描述】:
这篇文章已经过大量编辑和更新!
意图:
我正在编写一个应用程序,它本质上是一个迷你 ASP.NET MVC 3 会计包。我这样做是为了学习 EF 4.1 Code First 和脚手架
设置:
我正在使用带有 Mvc Scaffolding 1.0.2 的 SQL Server 2008 Express、Visual Studio 2010 SP1 和 ASP.NET MVC 3。
我有一个现有的数据库。该数据库有以下表格:
Accounts
Banks
CostCentres
Currencies
DebitCredits
People
Transactions
TransactionTypes
有许多关系,例如,Person_Accounts 等。
我现在想使用 MVC Scaffolding 创建一些输入页面,以便为我的数据库中的查找表创建数据。
我尝试了什么:
我创建了一个 .edmx 并使用它来创建使用 t4 自动生成的 POCO 类。一旦我有了 POCO 课程,就排除了 .edmx。
已经解决了 EF 4.1 Code First 没有找到它喜欢的连接字符串的问题,所以开始创建自己的 sql express 数据库(参见Rachel Appels blog for details on this gotcha)
终于使用约定上下文名称 = 连接字符串名称来获取 EF 代码首先与正确的数据库对话。
然后我使用 MVC 3 Scaffolding 来搭建视图。所以生成的存储库代码不是我自己的,而是 Steve Sanderson 的。
我以前没有使用过 EF,所以希望这是通过“查看和学习”的方式从 LINQ 发展到 SQL 的一种方式。
原来,我遇到了一些问题......
问题:
首先,如果我使用EF Code First创建的数据库,没有问题。
但是将连接字符串更改为我以前存在的数据库(我用来创建 .edmx 文件)我现在收到以下错误,例如,当我请求为 Accounts 实体搭建的索引视图时:
Invalid column name 'Account_AccountId'.
Invalid column name 'Account_AccountId'.
Invalid column name 'Currency_CurrencyId'.
Invalid column name 'Transaction_TransactionId'.
Invalid column name 'Account_AccountId1'.
Invalid column name 'Account_AccountId'.
Invalid column name 'Account1_AccountId'.
Invalid column name 'CostCentre_CostCentreId'.
Invalid column name 'Currency_CurrencyId'.
Invalid column name 'TransactionType_TransactionTypeId'.
Invalid column name 'Account_AccountId1'.
Invalid column name 'Account_AccountId2'.
Invalid column name 'Account_AccountId2'.
Invalid column name 'Account_AccountId'.
Invalid column name 'Account1_AccountId'.
Invalid column name 'CostCentre_CostCentreId'.
Invalid column name 'Currency_CurrencyId'.
Invalid column name 'TransactionType_TransactionTypeId'.
Invalid column name 'Account_AccountId1'.
Invalid column name 'Account_AccountId2'.
--注意:--
EF 创建的数据库和我创建的数据库(非常简单)之间的唯一区别是关系和几个触发器,以及一个 EdmMetadata 表。
--笔记结束--
我的推理:
乍一看,这是一个非常奇怪的错误,原因是尽管只想要一个没有任何相关数据的帐户列表,但发生的情况如下:
使用我预先存在的数据库或首先由代码创建的数据库,当我签入 SQL Profiler 时,它会显示一个条目 SQL:BatchStarting,其中包含一个似乎正在选择数据库中几乎所有内容的大量 SELECT 查询。我不知道为什么调用这个庞大的查询而不是对事务数据的简单选择。据推测,它正在尝试加载所有相关数据,但我没有要求。
再次强调,使用代码首先生成的数据库,一切正常。但是使用我预先存在的数据库,它会抛出上面显示的错误。
这里有两个问题:
一个是错误。为什么会这样??
另一个是用于数据库中几乎所有数据的巨大选择语句!
我的观点只是试图吐出一份客户记录列表。我对 CostCentres 或 Currencies 表等没有兴趣(对此视图)。
问题:
一个。为什么 Scaffolded 存储库要求提供所有数据?
b.为什么在预先存在的数据库中发生错误?
我在这个问题上设置了悬赏,回答以上两个问题的人将获得悬赏。
其他问题(与赏金无关!):
c。有谁知道指向博客的链接,我可以在其中阅读有关如何使用 MVC 3 脚手架和代码首先与现有数据库一起使用的信息?
d。有没有办法使用 t4 模板创建正确映射到现有数据库及其所有关系等的 DbContext 文件?
e。任何其他建议(不包括职业变化)?
f。有什么书可以阅读 EF 4.1 Code First 吗? (Julia Lerman 的最新版本是 EF 4.0,即 Code first 在发布时仅处于测试阶段)。
更新:
我已经回答了问题a(为什么要引入所有数据的巨大查询。脚手架存储库有一个方法:
public IQueryable<Account> AllIncluding(params Expression<Func<Account, object>>[] includeProperties)
{
IQueryable<Account> query = context.Accounts;
foreach (var includeProperty in includeProperties) {
query = query.Include(includeProperty);
}
return query;
}
从 Scaffolded 控制器调用:
//
// GET: /Accounts/
public ViewResult Index()
{
return View(accountRepository.AllIncluding(account => account.Person, account => account.DebitCredits, account => account.Transactions, account => account.Transactions1));
}
我很抱歉。我太糊涂了。
但问题 b 仍未得到解答。
【问题讨论】:
-
您能否提供信息 1) 现有数据库中哪些列有 Account 表,2) 生成的
Account类的外观如何,3) 查询的外观如何导致错误? -
@Slauma:我认为这个帖子现在太笨拙了。如果我没有深入了解,可能会单独询问。
标签: asp.net-mvc-3 entity-framework-4.1 ef-code-first asp.net-mvc-scaffolding