这一章我们介绍使用javascript脚本设置项目模板属性,关于visual c++ IDE中利用模板创建项目的内部机制在本章尾的外文文章中已有详细介绍,所以这里我们只是简述一下。
函数介绍
当我们使用模板新建工程时,有时会弹出类似图2-1的项目设置对话框,这些对话框都是采用html + css制作出来的(我对于web前端开发并不熟悉,
图 2-1 Application项目设置
此处难免有笔误),包含了与项目相关的变量如WIN_APP,CONSOLE_APP,DLL_APP,LIB_APP,EMPTY_PROJECT等,将会在以后设置项目属性时用到。最后当我们点击完成时文件scripts/2052/default.js中的OnFinish(selProj , selObj)函数就会被调用来设置编译器链接器属性并创建新项目。
文件夹scripts/2052中的default.js文件主要有五个函数
OnFinish(selProj , selObj) : 当用户点击完成按钮后将调用此函数(像Win32控制台程序当点击创建项目后会直接调用此函数),然后调用GetAppType()得到项目类型,调用AddSpecificConfig()设置编译器和链接器属性,最后创建工程。
SetFileProperties(projfile , strName) :不明
GetTargetName(strName , strProjectName , strResPath , strHelppath) :更改文件名,这将在稍后介绍。
GetAppType() :得到项目类型(exe , dll , lib)。
AddSpecificConfig(proj, strProjectName, bEmptyProject, strAppType) :设置编译器和链接器属性。
下面我们主要介绍OnFinish(selProj , selObj )函数,如代码 1-1所示,此函数在13行创建一个新的项目文件,就是vcxproj文件和sln文件(编译器与链接器属性设置都在vcxproj文件中),然后通过前面提到过的变量来修改项目属性。
&n
2012年12月11日,Entity Framework已经发布了Entity Framework 6 Alpha2,因项目需要,目前已使用了其中的两个特性,今天就来介绍一下第一个特性:全局性地自定义Code First约定(Custom Code First Conventions)。
应用场景
场景一:EF Code First默认使用类名作为表名,如果我们需要给表名加个前缀,例如将类名Category映射到表Shop_Category、将Product映射到Shop_Product,在EF 6之前,只能一个一个地使用Data Annotation( [Table("Shop_Category")] )或者Fluent API( ToTable("Shop_Category") )一个一个地指定表名。在实体类数量比较多的情况下,工作量就比较大了。
场景二:EF Code First默认将String类型的属性映射为nvarchar(max),但是你可能想要将它映射为nvarchar(255),那么也可以全局性地自定义,而不需要在所有String类型的属性上面使用[MaxLength(255)]进行配置。
当然使用场景不只这两个,如改写主外键的映射规则等等。简而言之,Custom Code First Conventions使你能够改写Entity Framework模型与数据库之间默认的映射规则。
自定义Code First约定的方式Code First的默认映射规则可以通过三种方式进行自定义,分别是:Lightweight Conventions(轻量级约定)、Configuration Conventions(配置型约定)、Model-based Conventions(基于模型的配置)。实现上的复杂度由Lightweight Conventions开始依次递增,当然,实现的自由度也依次增大。
2 {
3 static ProductContext()
4 {
5 Database.SetInitializer(
6 new DropCreateDatabaseIfModelChanges<ProductContext>());
7 }
8
9 public DbSet<Product> Products { get; set; }
10 }
11
12 public class Product
13 {
14 public int ProductId { get; set; }
15 public string Name { get; set; }
16 public string? Description {get; set;}
17 }
在这个模型中,默认情况下,EF会生成以下的数据表结构:
表名:Product字段名称 类型 是否可空 ProductId int 主键 Name
nvarchar(max) 否 Description
nvarchar(max) 是
我们以添加表前缀为例,来说明自定义Code First约定的前两种方式。
Lightweight Conventions
重写ProductContext的OnModelCreating(DbModelBuilder modelBuilder)方法:
2 {
3 protected override void OnModelCreating(DbModelBuilder modelBuilder)
4 {
5 modelBuilder.Entities().Configure(entity => entity.ToTable("Shop_" + entity.ClrType.Name));
6 }
7 }
Lightweight Conventions是最简单的实现方式,大部分的全局配置需求都能够以这种方式来实现。
Configuration Conventions
实现IConfigurationConvention<Type, EntityTypeConfiguration>接口,然后重写ProductContext的OnModelCreating(DbModelBuilder modelBuilder)方法。
2 : IConfigurationConvention<Type, EntityTypeConfiguration>
3 {
4 public void Apply(
5 Type type,
6 Func<EntityTypeConfiguration> configuration)
7 {
8 TableAttribute[] tableAttributes = (TableAttribute[])type.GetCustomAttributes(typeof(TableAttribute), false);
9
10 if (tableAttributes.Length == 0)
11 {
12 configuration().ToTable("Shop_" + type.Name);
13
文章管理这一块,按照左侧导航这一块向下写
到了“我的文章”这一块。
先还是打开【ArticleController】,添加public ActionResult UserOwn(int id = 0, int page = 1)
这里的id是指栏目id,可以显示自己发布的指定栏目的文章,默认为0显示说有栏目文章,page是页号默认为1。
这里也没什么内容主要是调用
学用MVC4做网站四:公共模型CommonModelRepository的List函数。
/// 我的文章
/// </summary>
/// <param name="id">栏目id</param>
/// <param name="page">页号</param>
[UserAuthorize]
public ActionResult UserOwn(int id = 0, int page = 1)
{
int _pageSize = 20;
int _cOrder = 0;
Category _c = null;
cModelRsy = new CommonModelRepository();
PagerData<CommonModel> _aData;
if (id > 0)
{
var _cRsy = new CategoryRepository();
_c =_cRsy.Find(id);
if (_c != null)
{
_pageSize = (int)_c.PageSize;
_cOrder = (int)_c.ContentOrder;
}
}
_aData = cModelRsy.List(id, false, "Article", UserController.UserName, page, _pageSize, _cOrder);
if (_c != null)
{
_aData.Config.RecordName = _c.RecordName;
_aData.Config.RecordUnit = _c.RecordUnit;
}
return View(_aData);
}
点右键添加强类型视图。模型类为PagerData<Ninesky.Models.CommonModel>(在添加模型类里没有这个选项,当时写分页控件时是想把分页控件独立出来,把PagerData类写在了Mvc空间里了,这里在添加视图时什么都不选,在添加完的视图文件顶部写上@model PagerData<Ninesky.Models.CommonModel>就行)
视图文件也很简单,上不是一个表格,@foreach循环添加表格内容,底部添加Html.Pager分页。
@{
ViewBag.Title = "我的文章";
Layout = "~/Views/Shared/_User.cshtml";
}
<div >
<div >
<div >
<img alt="" src="/blog_article/~/Content/Default/User/Images/Icon/Article_16.png" />您现在的位置: 文章管理
</div>
<div>
<table >
<tr>
<th>ID</th>
<th>栏目</th>
<th>标题</th>
<th>发表者</th>
<th>发布时间</th>
<th>状态</th>
<th>点击</th>
<th colspan="2">操作</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@item.CommonModelId</td>
<td>[@Html.ActionLink(item.Category.Name,"UserOwn",new {id=item.CategoryId})]</td>
<td >@item.Title</td>
<td>@item.Inputer</td>
<td>@item.ReleaseDate</td>
<td>@Ninesky.Models.CommonModel.ContentStatus.FirstOrDefault(c => c.Value == item.Status.ToString()).Text</td>
<td>@item.Hits</td>
<td>@Html.ActionLink("修改","UserEdit",new {id = item.CommonModelId})</td>
<td><a>删除</a></td>
</tr>
}
</table>
@Html.Pager(this.ViewContext.RouteData.Values,Model.Config,"pager","pag