原本我以为安装了VS2008 SP1,内置了ADO.NET Entity Framework,MVC框架什么的,结果ADO.NET Entity Framework是有,但是MVC没有,却意外的有另外一个东西——动态数据 Web 应用程序。如图1.
\n
图1
\n
好奇地创建了个“动态数据实体 Web 应用程序”。如图2.
\n
图2
\n
给我的第一感觉是,MVC换名字了?不应该吧!于是打开Global.asax文件看看是不是和MVC一样。如代码1.
\n
代码1
<!–
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
–>using System;
using System.Web.DynamicData;
using System.Web.Routing;
namespace WebApplication1
{
public class Global : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
MetaModel model = new MetaModel();
// 重要: 数据模型注册
// 取消注释此行以注册 LINQ to SQL 类或 ASP.NET 实体数据的
// ADO.NET 动态数据模型。若要设置 ScaffoldAllTables = true,需符合以下条件,
// 即确定希望数据模型中的所有表都支持支架(即模板)
// 视图。若要控制各个表的支架,请为表创建分部类,并将
// [Scaffold(true)] 属性应用于分部类。
// 注意: 请确保将“YourDataContextType”更改为应用程序的数据上下文类的
//名称。
//model.RegisterContext(typeof(YourDataContextType), new ContextConfiguration() { ScaffoldAllTables = false});
// 下面的语句支持分页模式,在这种模式下,“列表”、“详细”、“插入”
//和“更新”任务是使用不同页执行的。若要启用此模式,请取消注释下面
//的 route 定义,并注释掉后面的合并页模式部分中的 route 定义。
routes.Add(new DynamicDataRoute(“{table}/{action}.aspx”)
{
Constraints = new RouteValueDictionary(new { action = “List|Details|Edit|Insert” }),
Model = model
});
// 下面的语句支持合并页模式,在这种模式下,“列表”、“详细”、“插入”
//和“更新”任务是使用同一页执行的。若要启用此模式,请取消注释下面
//的 routes,并注释掉上面的分页模式部分中的 route 定义。
//routes.Add(new DynamicDataRoute(“{table}/ListDetails.aspx”) {
// Action = PageAction.List,
// ViewName = “ListDetails”,
// Model = model
//});
//routes.Add(new DynamicDataRoute(“{table}/ListDetails.aspx”) {
// Action = PageAction.Details,
// ViewName = “ListDetails”,
// Model = model
//});
}
void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
}
}
\n
感觉太像了,太神奇了,MVC换名字了?于是在IIS上添加了该站点,访问报“没有可访问的表。确保在 Global.asax 中注册了至少一个数据模型并启用了支架,或者实现自定义页面。”错误。肯定是没有设置数据的原因,现在发愁了,到底怎么设啊,只知道是在Global.asax里设置。
\n
找到报错的地方,在Default.aspx.cs文件中,如代码2.
\n
代码2
<!–
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
–> protected void Page_Load(object sender, EventArgs e)
{
System.Collections.IList visibleTables = MetaModel.Default.VisibleTables;
if (visibleTables.Count == 0)
{
throw new InvalidOperationException(“没有可访问的表。确保在 Global.asax 中注册了至少一个数据模型并启用了支架,或者实现自定义页面。”);
}
Menu1.DataSource = visibleTables;
Menu1.DataBind();
}
\n
估计是在Global.asax里设置Metamodel的数据库连接了。转到Global.asax文件。看到注释里有“重要: 数据模型注册”。取消第29行
\n
//model.RegisterContext(typeof(YourDataContextType), new ContextConfiguration() { ScaffoldAllTables = false });
\n
语句的注释。typeof(YourDataContextType)这里像是什么?很想Linq To Sql的名字***DataContext是不是?呵呵,建立一个Linq To Sql模型。然后把Linq To Sql的上下文注册到这里来。报错了,错误是,无法把Linq To Sql的DataContext转换到System.Data.Objects.ObjectContext类型。想起来ADO.NET Entity Framework也有这东西,于是创建一个。
\n
根据向导生成文件后,得到一个设计界面。如图3.
\n
\n
图3
\n图非常漂亮,呵呵。不管它,把YourDataContextType替换为创建的上下文。
\n
model.RegisterContext(typeof(NShip.DAL.NShipEntities), new ContextConfiguration() { ScaffoldAllTables = false });
\n
编译后访问,报错,调试一下发现MetaModel里有表了但是没有可见表。就是MetaModel.Default.Tables有现在数据库里的表了,但是MetaModel.Default.VisibleTables没有数据。可以通过循环的方式把MetaModel.Default.Tables里的表填充到MetaModel.Default.VisibleTables里,还可以让不想填充进去的不进去。而如果要全部指定,设置上面代码的ScaffoldAllTables = false 换成 ScaffoldAllTables = true。OK,再访问,出现图4:
\n
注意:如果在另外一个项目中创建ADO.NET Entity Framework数据库映射,那么需要在WEB项目中引用System.Data.Entity.
\n
\n
图4
\n
图4显示的表名就是我数据用ADO.NET Entity Framework映射的表。现在点开一个查看,如图5。
\n
\n
图5
\n
看看浏览器上的地址,是被重写过的,看来和MVC还是有点联系的地方。而重写的方法,刚才在Global.asax文件中也能看个大概。其它就不多说了,还是你自己去尝试吧,用这个东西做个数据库管理的后台实在是太简单了,太简单了。
\n\n