引文:本项目使用的使asp.net MVC的Code First即代码优先模型,不需要使用sqlServer,需要在Models文件夹目录下自建模型。然后更多利用代码的方式来进行增删改查
好处:我们就不用设计数据库和模型图,只需要添加类,包括修改字段等属性非常的方便,尤其适合敏捷开发环境,能够迅速响应变化
坏处:代码优先模型的坏处是无法适应复杂的数据库关系,如高级索引策略、存储过程、触发器、视图等)或者需要精细调整性能的地方,自动化的生成可能不够灵活或无法满足特定要求。反正我认为主要就是这个。
本篇文章先写一部分内容,个人博客这个项目主要分为普通用户和管理员(admin)去操作,那么在这个网站里面,普通用户能做的比较少,只能浏览博客网站信息,然后发一些留言,删除留言,然后跳到个人中心。管理员则可以对网站上的文章和分类和留言进行管理(增删改查).
第一部分:
在这个部分,我们首先需要先做网站主界面:对于.net项目,我们的主界面布局首先是在
Shared文件夹下面的Layout界面里面,这个是项目的主界面.
我们进入界面修改页面布局按照标准修改自己加一些样式能够修改处界面的大致效果即可,这里的样式是需要自己调整修改的:
页面的参考代码如下,同时确保你有对应的CSS样式文件引入,和相应的图片资源
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Jason lv博客</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
@* <link href="@Url.Content("")" rel="shortcut icon" />*@
<link href="@Url.Content("/Content/themes/Style.css")" rel="stylesheet" type="text/css" />
</head>
<body>
<!--header-->
<div class="block header" style="height: 60px; width: 1500px; ">
<form action="/Article/Search" method="get" style="margin-left:1110px;margin-top:90px;">
<div style="display: flex; align-items: center; justify-content: space-between;">
<div style="width: 100px; margin-left: -1000px;">
<a style="font-size:30px">Jason.Lv</a>
</div>
<div>
<input type="text" name="key" class="button" />
<input type="submit" value="搜索" class="submit" />
</div>
</div>
</form>
</div>
<div class="menu" style="margin-left: 50px; height: 100px; width: 1500px;text-align:center">
<ul>
<li style="text-align:center;margin-left:50px;">@Html.ActionLink("网站首页", "index", "Article")</li>
<li style="text-align: center; margin-left: 35px;">@Html.ActionLink("关于我", "about", "Home")</li>
<li style="text-align: center; margin-left: 35px;">@Html.ActionLink("我要留言", "index", "GuestBook")</li>
<li style="text-align: center; margin-left: 35px;">@Html.ActionLink("管理", "index", "Articles", new { area = "admin" }, null)</li>
</ul>
</div>
<!--middle-->
<div class="block middle" style="margin-left: 50px; background-color: white; margin-top: -30px; height: 900px; width: 1500px; display: flex; justify-content: space-between;">
<div class="right-side">
<div class="body_resize">
<img src="@Url.Content("~/Content/images/热点新闻.jpg")" width="200" height="100" style="margin-top:10px;margin-left:10px;border-radius:20px" />
<ul class="list_xw" style="height: 110px; background-color: lightpink; width: 160px; margin-left: 10px; margin-top: 20px; border-radius: 10px">
@{
Html.RenderAction("Top10", "Article");
}
</ul>
<img src="@Url.Content("~/Content/images/分类列表.png")" width="200" height="100" style="margin-top:10px;margin-left:10px ;border-radius:20px" />
<ul class="list_fl" style="height: 35px; background-color: lightpink; width: 160px; margin-left: 10px; margin-top: 20px; border-radius: 10px">
<div>
<a href="@Url.Action("List", "Category")">分类列表</a>
</div>
</ul>
<img src="@Url.Content("/Content/images/友情链接.png")" width="200" height="100" style="margin-top: 10px; margin-left: 10px; border-radius: 20px" />
<div class="list_lj">
<ul style="height: 40px; background-color: lightpink; width: 160px; margin-left: 10px; margin-top: 20px; border-radius: 10px">
<li style="margin-bottom:10px"><a href="#" target="_blank">Jason LV</a></li>
</ul>
</div>
</div>
</div>
<div class="mainbody" style="margin-right:600px;">
@RenderBody()
</div>
</div>
<!--footer-->
</body>
第二部分:
在我们的Models目录下面创建(位于项目根目录),创建三个模型类和数据库的上下文然后初始化数据库:
Article模型:
public class Article
{
[Key]
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public string CategoryName { get; set; }
public System.DateTime addDate { get; set; }
public int Hit { get; set; }
public int Category_Id { get; set; }
public virtual Category Category { get; set; }
}
GuestBook模型:
public class GuestBook
{
[Key]
public int Id { get; set; }
public string Nickname { get; set; }
public string Message { get; set; }
public System.DateTime AddDate { get; set; }
public string Reply { get; set; }
}
Category模型:
public class Category
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual List<Article> ArticleSet { get; set; }
}
第三部分:
创建数据库上下文 ,在Models目录下面创建一个添加模型:
选择这个
添加完成类似于这个,然后在里面加入我们代码优先模型的数据库上下文:
数据库上下文参考代码如下:
public class Model2 : DbContext
{
public Model2()
: base("name=Model2")
{
}
public virtual DbSet<Article> Articles { get; set; }
public virtual DbSet<Category> Categories { get; set; }
public virtual DbSet<GuestBook> GuestBooks { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Article>()
.HasRequired(a => a.Category) // Article 必须有对应的 Category
.WithMany(c => c.ArticleSet) // 一个 Category 可以有多个 Article
.HasForeignKey(a => a.Category_Id); // 外键
}
}
这一部分用于两个表之间的关联(这段代码已经写过了,这里只做解释):
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Article>()
.HasRequired(a => a.Category) // Article 必须有对应的 Category
.WithMany(c => c.ArticleSet) // 一个 Category 可以有多个 Article
.HasForeignKey(a => a.Category_Id); // 外键
}
点开项目的最底下的Web.Config文件,配置字符串(.net高版本自动帮你配置好了,无需修改,具体那个版本之后我也不清楚)这是我的字符串配置,你们可以找一下,应该有的.仅供参考,不要复制这个.
<connectionStrings>
<add name="Model2" connectionString="data source=(LocalDb)\MSSQLLocalDB;initial catalog=个人博客.Models.Model2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> /></connectionStrings>
第四部分:
实体化数据库,往原始的数据库添加一些内容,这一部分,同样我们在Models文件夹目录下面添加一个类用来存储基础的一些数据:
在这里然后修改一下你需要的类名即可;
然后往里面,添加我们所需要的数据:参考代码如下
public class VBlogInitializer: DropCreateDatabaseIfModelChanges<Model2>
{
protected override void Seed(Model2 context)
{
var gbooks = new List<GuestBook>
{
new GuestBook
{
Nickname="大下",
Message="网站很漂亮",
AddDate=DateTime.Parse("2013-7-16 10:12:17"),
},
new GuestBook
{
Nickname="大下",
Message="网站很漂亮",
AddDate=DateTime.Parse("2013-7-16 10:12:17"),
Reply="很好笑"
},
};
gbooks.ForEach(g=>context.GuestBooks.Add(g));
context.SaveChanges();
var categories = new List<Category>
{
new Category(){
Id=1,
Name="日常小记"
},
new Category(){
Id=2,
Name="技术交流"
},
};
categories.ForEach(g => context.Categories.Add(g));
context.SaveChanges();
var articles = new List<Article>
{
new Article()
{
Title="长度的单位",
Content="在我读小学的时候,有一次上公开课,老师问我们一个问题:各位同学,有谁知道长度的单位是" +
"什么,啊?这时候,班上一个最乖的同学举手回答,这是老师可签安排好的,当然是它回答。老师,是米!",
addDate=DateTime.Parse("2013-7-16 10:12:17"),
Hit=1,
Category_Id=1
},
new Article()
{
Title="程序员餐厅",
Content="我真想开一个程序员餐厅,我当老板,一楼餐厅有包间,Java包间,Linux包间,搞开源的软件就坐在大" +
"厅里面,有什么的就上二楼,菜价全部用十六进制,这样看着便宜吗,不知道吃起来怎么样",
addDate=DateTime.Parse("2013-7-16 10:12:17"),
Hit=1,
Category_Id=1
},
new Article()
{
Title="MVC模式",
Content="MVC(Model-View-Controller)是一种广泛应用在软件开发领域的设计模式," +
"特别是在Web应用程序中,它旨在分离应用程序的不同关注点,提高代码的可维护性、可重用性和可测试性",
addDate=DateTime.Parse("2013-7-16 10:12:17"),
Hit=1,
Category_Id=1
}
};
articles.ForEach(g => context.Articles.Add(g));
context.SaveChanges();
}
}
然后我们需要去一个名为:Global.asax文件夹下面修改一些配置:
加入这个,这里的个人博客是我的项目名称,可以改为你们的:
在底下加入,加入的是最后一行
这句代码初始化我们创建的数据库 ,这样子数据得以保存
Database.SetInitializer<Model2>(new VBlogInitializer());
第五部分:
补充几点:
1.事实上第四部分我们在实体化数据库的时候,我们这里的
在我们上面的第四部分的时候,我们在使用DropCreateDatabaseIfModelChanges这个创建数据库方法的时候不如使用DropCreateDatabaseAlways,当然这是针对于项目还在做的时候。那这两者的区别就是第一个我们只有改变了模型里面的属性和字段才能够删除并且重新创建数据库,第二个方法是我们创建数据库的时候每运行一次都会删除原来的数据库,重新搭建一个,这样子我们在每次运行创建的数据库都是新的,这样子也有助于数据库属性字段的及时跟新。当然项目完成后还是建议使用第一个来保存数据.
2.关于第一个的页面布局,事实上是html和css的内容,我没有办法写的特别详细,因为博主的网页搭建知识也有点忘了,需要样式源码的话下载不了,只能自己写样式,回去研究一下布局的样式,找一些图片加进去,页面做的差不多即可
下一节来实现一些网站分页等等功能