科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件ASP.NET:自定义实体类简介(6)

ASP.NET:自定义实体类简介(6)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

自定义实体使您获得了面向对象的编程的丰富功能,并帮助您构建了可靠、可维护的 N 层体系结构的框架。

作者:microsoft 来源:Karl Seguin  2007年9月2日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

对于在许多数据绑定控件提供的 OnItemDataBound 或 OnItemCreated 中执行处理的人来说,您可能会将 e.Item.DataItem 强制转换成 DataRowView。当绑定到自定义集合时,e.Item.DataItem 则被强制转换成自定义实体,在我们的示例中为 User 类:

'Visual Basic .NET

Protected Sub r_ItemDataBound (s As Object, e As RepeaterItemEventArgs)

Dim type As ListItemType = e.Item.ItemType

If type = ListItemType.AlternatingItem OrElse

? type = ListItemType.Item Then

Dim u As Label = CType(e.Item.FindControl("userName"), Label)

Dim currentUser As User = CType(e.Item.DataItem, User)

If Not PasswordUtility.PasswordIsSecure(currentUser.Password) Then

ul.ForeColor = Drawing.Color.Red

End If

End If

End Sub

//C#

protected void r_ItemDataBound(object sender, RepeaterItemEventArgs e) {

ListItemType type = e.Item.ItemType;

if (type == ListItemType.AlternatingItem ||

? type == ListItemType.Item){

Label ul = (Label)e.Item.FindControl("userName");

User currentUser = (User)e.Item.DataItem;

if (!PasswordUtility.PasswordIsSecure(currentUser.Password)){

ul.ForeColor = Color.Red;

}

}

}

管理关系

即使在最简单的系统中,实体之间也存在关系。对于关系数据库,可以通过外键维护关系;而使用对象时,关系只是对另一个对象的引用。例如,根据我们前面的示例,User 对象完全可以具有一个 Role:

'Visual Basic .NET

Public Class User

Private _role As Role

Public Property Role() As Role

Get

Return _role

End Get

Set(ByVal Value As Role)

_role = Value

End Set

End Property

End Class

//C#

public class User {

private Role role;

public Role Role {

get {return role;}

set {role = value;}

}

}

或者一个 Role 集合:

'Visual Basic .NET

Public Class User

Private _roles As RoleCollection

Public ReadOnly Property Roles() As RoleCollection

Get

If _roles Is Nothing Then

_roles = New RoleCollection

End If

Return _roles

End Get

End Property

End Class

//C#

public class User {

private RoleCollection roles;

public RoleCollection Roles {

get {

if (roles == null){

roles = new RoleCollection();

}

return roles;

}

}

}

在这两个示例中,我们有一个虚构的 Role 类或 RoleCollection 类,它们就是类似于 User 和 UserCollection 类的其他自定义实体或集合类。

映射关系

真正的问题在于如何映射关系。让我们看一个简单的示例,我们希望根据 userId 及其角色来检索一个用户。首先,我们看一看关系模型:



图 3:User 与 Role 之间的关系

这里,我们看到了一个 User 表和一个 Role 表,我们可以将这两个表都以直观的方式映射到自定义实体。我们还有一个 UserRoleJoin 表,它代表了 User 与 Role 之间的多对多关系。

然后,我们使用存储过程来获取两个单独的结果:第一个代表 User,第二个代表该用户的 Role:

CREATE PROCEDURE GetUserById(

@UserId INT

)AS

SELECT UserId, UserName, [Password]

FROM Users

WHERE UserId = @UserID

SELECT R.RoleId, R.[Name], R.Code

FROM Roles R INNER JOIN

UserRoleJoin URJ ON R.RoleId = URJ.RoleId

WHERE URJ.UserId = @UserId

最后,我们从关系模型映射到对象模型:

'Visual Basic .NET

Public Function GetUserById(ByVal userId As Integer) As User

Dim connection As New SqlConnection(CONNECTION_STRING)

Dim command As New SqlCommand("GetUserById", connection)

command.Parameters.Add("@UserId", SqlDbType.Int).Value = userId

Dim dr As SqlDataReader = Nothing

Try

connection.Open()

dr = command.ExecuteReader()

Dim user As User = Nothing

If dr.Read() Then

user = PopulateUser(dr)

dr.NextResult()

While dr.Read()

user.Roles.Add(PopulateRole(dr))

End While

End If

Return user

Finally

If Not dr Is Nothing AndAlso Not dr.IsClosed Then

dr.Close()

End If

connection.Dispose()

command.Dispose()

End Try

End Function

//C#

public User GetUserById(int userId) {

SqlConnection connection = new SqlConnection(CONNECTION_STRING);

SqlCommand command = new SqlCommand("GetUserById", connection);

command.Parameters.Add("@UserId", SqlDbType.Int).Value = userId;

SqlDataReader dr = null;

try{

connection.Open();

dr = command.ExecuteReader();

User user = null;

if (dr.Read()){

user = PopulateUser(dr);

dr.NextResult();

while(dr.Read()){

user.Roles.Add(PopulateRole(dr));

}

}

return user;

}finally{

if (dr != null && !dr.IsClosed){

dr.Close();

}

connection.Dispose();

command.Dispose();

}

}

User 实例即被创建和填充;我们转移到下一个结果/选择并进行循环,填充 Role 并将它们添加到 User 类的 RolesCollection 属性中。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章