Easyui入门视频教程 第03集---Easyui布局

目录

-----------------------

回顾前面

Easyui的引入 顺序一定要注意

 <script src="../Contents/Easyui/jquery-1.8.0.min.js" type="text/javascript"></script>
<script src="../Contents/Easyui/jquery.easyui.min.js" type="text/javascript"></script>
<script src="../Contents/Easyui/easyui-lang-zh_CN.js" type="text/javascript"></script>

就是 jquery 放在前面 easyui 要在lang的后面

布局的话 东南西北中 这样的形式 上北下南左西右东中间

但是 中间这个 一定要用 其他可以没有

下面是 easyui 最基本的一个布局

<div class="easyui-layout" style="width:700px;height:350px;">
<div data-options="region:'north'" style="height:50px"></div>
<div data-options="region:'south',split:true" style="height:50px;"></div>
<div data-options="region:'east',split:true" title="East" style="width:180px;"></div>
<div data-options="region:'west',split:true" title="West" style="width:100px;"></div>
<div data-options="region:'center',title:'Main Title',iconCls:'icon-ok'">
<table class="easyui-datagrid"
data-options="url:'../layout/datagrid_data1.json',border:false,singleSelect:true,fit:true,fitColumns:true">
<thead>
<tr>
<th data-options="field:'itemid'" width="80">Item ID</th>
<th data-options="field:'productid'" width="100">Product ID</th>
<th data-options="field:'listprice',align:'right'" width="80">List Price</th>
<th data-options="field:'unitcost',align:'right'" width="80">Unit Cost</th>
<th data-options="field:'attr'" width="150">Attribute</th>
<th data-options="field:'status',align:'center'" width="50">Status</th>
</tr>
</thead>
</table>
</div>
</div>

视频下载

http://pan.baidu.com/s/1dDeg8xz

Entity Framework Code First (六)存储过程

 

  声明:本文只针对 EF6+

  默认情况下,Code First 对实体进行插入、更新、删除操作是直接在表上进行的,从 EF6 开始你可以选择使用存储过程(Stored Procedures

简单实体映射 Basic Entity Mapping

  注意:本文将使用 Fluent API 来配置使用存储过程

 
modelBuilder.Entity<Blog>()
.MapToStoredProcedures();

  上面的代码执行后,Code First 将利用某些约定在数据库中生成一些存储过程:

  • 生成三个存储过程,名称分别为<type_name>_Insert<type_name>_Update<type_name>_Delete (本例为 Blog_Insert, Blog_Update, Blog_Delete);
  • 参数名对应于属性名 (注意:如果在 property上使用 HasColumnName() 或者 Column attribute 来重命名,那么参数也将使用这个重命名过的名称 );
  • The insert stored procedure 为每一个属性都有一个参数,除了那些标记为数据库产生的(identity or computed),返回结果为那些标记为数据库产生的属性列;
  • The update stored procedure 为每一个属性都有一个参数,除了那些标记为数据库产生且模式为 computed 的。一些并发标记的需要一个代表原始值的参数(更多信息请参考 Concurrency Tokens section)。返回值为那些 computed property 的列;
  • The delete stored procedure 参数为实体主键(或者组合主键),此外也需要为每一个独立关联的外键准备一个参数(指那些没有在实体上定义相应外键属性的关系),一些并发标记的需要一个代表原始值的参数(更多信息请参考 Concurrency Tokens section

  存储过程的具体内容如下

 

Overriding the Defaults

  你可以重写部分或全部的默认配置

重写存储过程名

  重写 update 存储过程名

modelBuilder.Entity<Blog>()
.MapToStoredProcedures(s =>
s.Update(u => u.HasName("modify_blog")));

  重写所有的存储过程名

modelBuilder.Entity<Blog>()
.MapToStoredProcedures(s =>
s.Update(u => u.HasName("modify_blog"))
.Delete(d => d.HasName("delete_blog"))
.Insert(i => i.HasName("insert_blog")));

  效果与下面使用一样 lambda block syntax

modelBuilder.Entity<Blog>()
.MapToStoredProcedures(s =>
{
s.Update(u => u.HasName("modify_blog"));
s.Delete(d => d.HasName("delete_blog"));
s.Insert(i => i.HasName("insert_blog"));
});

重写存储过程参数名

modelBuilder
.Entity<Blog>()
.MapToStoredProcedures(s =>
s.Update(u => u.Parameter(b => b.BlogId, "blog_id")));

  上面所有的操作都是可组合的和链式的,如如下示例重命名所有的存储过程及其参数名

modelBuilder
.Entity<Blog>()
.MapToStoredProcedures(s =>
s.Update(u => u.HasName("modify_blog")
.Parameter(b => b.BlogId, "blog_id")
.Parameter(b => b.Name, "blog_name")
.Parameter(b => b.Url, "blog_url"))
.Delete(d => d.HasName("delete_blog")
.Parameter(b => b.BlogId, "blog_id"))
.Insert(i => i.HasName("insert_blog")
.Parameter(b => b.Name, "blog_name")
.Parameter(b => b.Url, "blog_url")));

重命名数据库产生的返回列名

modelBuilder.Entity<Blog>()
.MapToStoredProcedures(s =>
s.Insert(i => i.Result(b => b.BlogId, "generated_blog_identity")));
CREATE PROCEDURE [dbo].[Blog_Insert]
@Name [nvarchar](max),
@Url [nvarchar](max)
AS
BEGIN
INSERT [dbo].[Blog]([Name], [Url])
VALUES (@Name, @Url) DECLARE @BlogId int
SELECT @BlogId = [BlogId]
FROM [dbo].[Blog]
WHERE @@ROWCOUNT > 0 AND [BlogId] = scope_identity() SELECT t0.[BlogId] AS generated_blog_identity, t0.[Timestamp]
FROM [dbo].[Blog] AS t0
WHERE @@ROWCOUNT > 0 AND t0.[BlogId] = @BlogId
END

无外键关系 Relationships Without a Foreign Key in the Class

  如果实体上有定义外键属性,那么其重命名操作与其它属性无异。如果实体间的关系存在,但是并没定义外键属性,那么默认的参数名为 <navigation_property_name>_<primary_key_name>

 

  如上类定义将会导致在 Insert 和 Update Post 存储过程中产生参数 Blog_BlogId

 

Overriding the Defaults  

  通过提供主键属性给 Parameter 方法,你可以重命名在类中没有包含的外键参数名

modelBuilder.Entity<Post>()
.MapToStoredProcedures(s =>
s.Insert(i => i.Parameter(p => p.Blog.BlogId, "blog_id")));

  生成的 Insert 存储过程如下

CREATE PROCEDURE [dbo].[Post_Insert]
@Title [nvarchar](max),
@Content [nvarchar](max),
@blog_id [int]
AS
BEGIN
INSERT [dbo].[Post]([Title], [Content], [Blog_BlogId])
VALUES (@Title, @Content, @blog_id) DECLARE @PostId int
SELECT @PostId = [PostId]
FROM [dbo].[Post]
WHERE @@ROWCOUNT > 0 AND [PostId] = scope_identity() SELECT t0.[PostId]
FROM [dbo].[Post] AS t0
WHERE @@ROWCOUNT > 0 AND t0.[PostId] = @PostId
END

  如果在从属实体(dependent entity)上没有导航属性(navigation property)(例如 Post.Blog),你可以使用 Navigation(原文是 Association 方法,但笔者发现根本没有此方法) 方法来确定另一端的关系然后为相应的主键(或组合主键)配置参数

public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
}
modelBuilder.Entity<Post>()
.MapToStoredProcedures(s =>
s.Insert(i => i.Navigation<Blog>(
b => b.Posts,
c => c.Parameter(b => b.BlogId, "blog_id"))));

  产生的存储过程如下

CREATE PROCEDURE [dbo].[Post_Insert]
@Title [nvarchar](max),
@Content [nvarchar](max),
@blog_id [int]
AS
BEGIN
INSERT [dbo].[Post]([Title], [Content], [Blog_BlogId])
VALUES (@Title, @Content, @blog_id) DECLARE @PostId int
SELECT @PostId = [PostId]
FROM [dbo].[Post]
WHERE @@ROWCOUNT > 0 AND [PostId] = scope_identity() SELECT t0.[PostId]
FROM [dbo].[Post] AS t0
WHERE @@ROWCOUNT > 0 AND t0.[PostId] = @PostId
END

并发标记 Concurrency Tokens

  Update 和 Delete 存储过程也需要处理并发问题:

  • 如果实体包含并发标记,存储过程可选择地有一个 Output 参数用于返回更新/删除的列的数目,这样一个参数必须通过方法 RowsAffectedParameter 配置(注意:EF 默认使用 ExecuteNonQuery 的返回值来确定有多少行受影响,如果你在存储过程中执行逻辑操作将导致 ExecuteNonQuery 的返回值是错误的,此时指定一个行影响的 Output 参数是有必要的);
  • 每一个并发标记,都有一个参数,命名为 <property_name>_Original (如 Timestamp_Original),这个参数将传递属性的原始值 - 从数据库查询的值
    • 数据库计算(computed)的并发标记 - 例如 timestamp - 将有一个原始值参数;
    • 非计算属性的并发标记在 Update 存储过程中也有一个更新值参数,只是使用之前讨论过的为新值的命名约定。此处的一个例子为用 Blog 的 URL 作为并发标记,更新后的新值是必须的因为这个值可能被你的代码更新成另一个新值(不像 Timestamp 标记只能被数据库更新)

  

  一个计算并发标记(timestamp)标记的例子

public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public string Url { get; set; } [Timestamp]
public byte[] Timestamp { get; set; }
}
modelBuilder.Entity<Blog>()
.MapToStoredProcedures();
CREATE PROCEDURE [dbo].[Blog_Update]
@BlogId [int],
@Name [nvarchar](max),
@Url [nvarchar](max),
@Timestamp_Original [rowversion]
AS
BEGIN
UPDATE [dbo].[Blog]
SET [Name] = @Name, [Url] = @Url
WHERE (([BlogId] = @BlogId) AND (([Timestamp] = @Timestamp_Original) OR ([Timestamp] IS NULL AND @Timestamp_Original IS NULL))) SELECT t0.[Timestamp]
FROM [dbo].[Blog] AS t0
WHERE @@ROWCOUNT > 0 AND t0.[BlogId] = @BlogId
END

  

  一个非计算并发标记(URL)例子

 public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
[ConcurrencyCheck]
public string Url { get; set; }
}
CREATE PROCEDURE [dbo].[Blog_Update]
@BlogId [int],
@Name [nvarchar](max),
@Url [nvarchar](max),
@Url_Original [nvarchar](max)
AS
BEGIN
UPDATE [dbo].[Blog]
SET [Name] = @Name, [Url] = @Url
WHERE (([BlogId] = @BlogId) AND (([Url] = @Url_Original) OR ([Url] IS NULL AND @Url_Original IS NULL)))
END

Overriding the Defaults

  使用 RowsAffectedParameter 方法

modelBuilder.Entity<Blog>()
.MapToStoredProcedures(s =>
s.Update(u => u.RowsAffectedParameter("rows_affected")));
CREATE PROCEDURE [dbo].[Blog_Update]
@BlogId [int],
@Name [nvarchar](max),
@Url [nvarchar](max),
@Url_Original [nvarchar](max),
@rows_affected [int] OUT
AS
BEGIN
UPDATE [dbo].[Blog]
SET [Name] = @Name, [Url] = @Url
WHERE (([BlogId] = @BlogId) AND (([Url] = @Url_Original) OR ([Url] IS NULL AND @Url_Original IS NULL))) SET @rows_affected = @@ROWCOUNT
END

  

  对于计算并发标记 - 只有原始值需要传递 - 我们可以使用标准的 Pameter 方法来重命名参数名

 modelBuilder.Entity<Blog>()
.MapToStoredProcedures(s =>
s.Update(u => u.Parameter(b => b.Timestamp, "blog_timestamp")));

  对于非计算并发标记 - 原始值和更新值都需传递 - 我们可以使用 Parameter 方法的重载版本来为每一个参数重命名

modelBuilder.Entity<Blog>()
.MapToStoredProcedures(s => s.Update(u => u.Parameter(b => b.Url, "blog_url", "blog_original_url")));

N:N 关系 Many to Many Relationships

  定义如下类

public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; } public virtual ICollection<Tag> Tags { get; set; }
} public class Tag
{
public int TagId { get; set; }
public string TagName { get; set; } public virtual ICollection<Post> Posts { get; set; }
}

  映射到存储过程

modelBuilder.Entity<Post>()
.HasMany(p => p.Tags)
.WithMany(t => t.Posts)
.MapToStoredProcedures();

  默认生成的存储过程如下:

  • 生成两个存储过程,命名为 <type_one><type_two>_Insert 和 <type_one><type_two>_Delete (本例中为 PostTag_Insert PostTag_Delete);
  • 参数为每一类型的主键(或组合主键),命名为 <type_name>_<property_name> (本例为 Post_PostId 和 Tag_TagId
CREATE PROCEDURE [dbo].[PostTag_Insert]
@Post_PostId [int],
@Tag_TagId [int]
AS
BEGIN
INSERT [dbo].[PostTag]([Post_PostId], [Tag_TagId])
VALUES (@Post_PostId, @Tag_TagId)
END CREATE PROCEDURE [dbo].[PostTag_Delete]
@Post_PostId [int],
@Tag_TagId [int]
AS
BEGIN
DELETE [dbo].[PostTag]
WHERE (([Post_PostId] = @Post_PostId) AND ([Tag_TagId] = @Tag_TagId))
END

Overriding the Defaults

  可以像配置实体存储过程一样来配置此存储过程和参数的名称

modelBuilder.Entity<Post>()
.HasMany(p => p.Tags)
.WithMany(t => t.Posts)
.MapToStoredProcedures(s =>
s.Insert(i => i.HasName("add_post_tag")
.LeftKeyParameter(p => p.PostId, "post_id")
.RightKeyParameter(t => t.TagId, "tag_id"))
.Delete(d => d.HasName("remove_post_tag")
.LeftKeyParameter(p => p.PostId, "post_id")
.RightKeyParameter(t => t.TagId, "tag_id")));

  产生的存储过程如下

CREATE PROCEDURE [dbo].[add_post_tag]
@post_id [int],
@tag_id [int]
AS
BEGIN
INSERT [dbo].[PostTag]([Post_PostId], [Tag_TagId])
VALUES (@post_id, @tag_id)
END CREATE PROCEDURE [dbo].[remove_post_tag]
@post_id [int],
@tag_id [int]
AS
BEGIN
DELETE [dbo].[PostTag]
WHERE (([Post_PostId] = @post_id) AND ([Tag_TagId] = @tag_id))
END

  原文链接:http://msdn.microsoft.com/en-us/data/dn468673

作者:舍长
 
分类: html

Easyui布局的更多相关文章

  1. EasyUI学习总结(六)——EasyUI布局

    一.EasyUI布局介绍 easyUI布局容器包括东.西.南.北.中五个区域,其中中心面板是必须的,而东.西.南.北这四个面板是可选的,如果布局里面不需要东.西.南.北这四个面板,那么可以把相应的di ...

  2. Easyui入门视频教程 第04集---Easyui布局

    目录 目录 ----------------------- Easyui入门视频教程 第09集---登录完善 图标自定义   Easyui入门视频教程 第08集---登录实现 ajax button的 ...

  3. Easyui入门视频教程 第03集---Easyui布局

    Easyui入门视频教程 第03集---Easyui布局 目录 ----------------------- Easyui入门视频教程 第09集---登录完善 图标自定义   Easyui入门视频教 ...

  4. EasyUI学习总结(六)——EasyUI布局(转载)

    本文转载自:http://www.cnblogs.com/xdp-gacl/p/4088198.html 一.EasyUI布局介绍 easyUI布局容器包括东.西.南.北.中五个区域,其中中心面板是必 ...

  5. easyui 布局自适应

    最近在把以前写的一个项目改成用easyui做前端.过程中遇到了不少问题.其中一个就是datagrid不能很好的布局.想了好多办法都有局限.最后想到会不会是布局(easyui-layout)的问题,经过 ...

  6. jQuery EasyUI布局容器layout实例精讲

    这个布局容器,有五个区域:北.南.东.西和中心. 他中心地区面板是必需的,但是边缘地区面板是可选的.每一个边缘地区面板可以缩放的拖动其边境, 他们也可以通过点击其收缩触发.布局可以嵌套,从而用户可以建 ...

  7. easyui 布局之window和panel一起使用时,拉动window宽高时panel不跟随一起变化

    项目开发中布局是每一个组件都由最外层的window和内部的至少一个panel组成,其他的细小组件再依次放到panel中. 问题:当拉动外部的window时我们希望内部的panel的宽高也跟着变化,但是 ...

  8. EasyUI 布局 - 动态添加标签页(Tabs)

    首先导入js <link rel="stylesheet" href="../js/easyui/themes/default/easyui.css"&g ...

  9. easyUI 布局

    Layout(布局) 布局容器有5个区域:北.南.东.西和中间.中间区域面板是必须的,边缘的面板都是可选的. 每个边缘区域面板都可以通过拖拽其边框改变大小,也可以点击折叠按钮将面板折叠起来.布局可以进 ...

随机推荐

  1. C# Windows Schedule task此次收购task下一步执行时间

    最近进行了一次需求和Windows Schedule task相关职能,通过schedule,计算下一次运行task时间. 它用于由第三方DLL实现,以下网站,以下载来自: http://tasksc ...

  2. 10个devexpress ASPxPivotGrid常见问题

    原文:10个devexpress ASPxPivotGrid常见问题 1.DXperience ASPxGridView如何开启lightweight模式 描述:ASPxGridView样式主题中pa ...

  3. Java设计模式(四) 装饰 代理模式

    (七)装饰 Decorator 装饰是一个对象,以动态地增加一些新功能. 象与被装饰的对象须要实现同一个接口.装饰对象持有被装饰对象的实例. interface DecoratorSourceable ...

  4. Repository模式

    Repository模式的两种写法与疑惑 现如今DDD越来越流行,园子里漫天都是介绍关于它的文章.说到DDD就不能不提Repository模式了,有的地方也叫它仓储模式. 很多时候我们对Reposit ...

  5. linux_java_redis_postgresql_常用命令

     redis 常用语法telnet 192.168.18.210 6379keys *llen队列名称llen 队列名称 postgresql常用语法psql -h192.168.18.210 -Up ...

  6. 深入解析java乱码

    1.什么是编码 ,为什么要编码 先前从没有思考这么深入的问题,觉得一切理所当然,直到有一天java的乱码让我跪了,他不在听我的话,到处是乱码,这次我不打算放过它,我要收拾了它. 大家都知道,文本文件, ...

  7. hdu2203 KMP水的问题

    两种方法     首先是纯KMP #include<stdio.h> #include<string.h> #include<iostream> using nam ...

  8. 代理模式与Android

    代理模式(Proxy) 一.   什么是代理模式 先来看看官方的说法,代理模式就是为其它对象提供一种代理,以控制对这个对象的訪问. 看来这个官方的说法的确有点官方,看了还是让人感觉不点不知所措,还是不 ...

  9. css3实现色子自动翻转效果

    原文:css3实现色子自动翻转效果 css3使我们能够跳出2d空间,实现3维空间的动画效果,这里给出一个自动翻转的3d色子动画效果制作过程. 第一步,首先进行HTML的布局,对于3D效果,布局有一定的 ...

  10. asp.net mvc3 数据验证(二)——错误信息的自定义及其本地化

    原文:asp.net mvc3 数据验证(二)--错误信息的自定义及其本地化 一.自定义错误信息         在上一篇文章中所做的验证,在界面上提示的信息都是系统自带的,有些读起来比较生硬.比如: ...