加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – RIA服务不返回包含类型集合属性

发布时间:2020-12-16 01:35:30 所属栏目:百科 来源:网络整理
导读:我有一个WCF RIA Services应用程序和一个UserRole类型的模型,其中包含UserPermission对象的集合.我在域服务中使用.Include(“UserPermission”),当我调试它时,我确认它在返回之前肯定包含UserPermission类型. 当我调试Silverlight 3客户端时,它返回UserRoles
我有一个WCF RIA Services应用程序和一个UserRole类型的模型,其中包含UserPermission对象的集合.我在域服务中使用.Include(“UserPermission”),当我调试它时,我确认它在返回之前肯定包含UserPermission类型.

当我调试Silverlight 3客户端时,它返回UserRoles,但UserPermission属性都是空的.这些是显示在服务上具有UserPermissions的UserRoles.

由于服务和客户端上的所有内容都是正确的,我专注于元数据类,但仍然找不到任何错误.

[MetadataTypeAttribute(typeof(UserRole.UserRoleMetadata))]
public partial class UserRole
{
    internal sealed class UserRoleMetadata
    {
        public int RoleID;
        public string Name;

        [Include]
        [Association("UserPermissions","RoleID","PermissionID")]
        public EntityCollection<UserPermission> UserPermissions;
    }
}

这是域服务方法:

public IEnumerable<UserRole> GetUserRoles()
{
    IEnumerable<UserRole> roles = this.ObjectContext.UserRole.Include("UserPermissions");
    return roles; // In debug,roles.First().UserPermissions.Count = 2 here
                  // For now,there is only one single role in the ObjectContext and it has
                  // two UserPermissions
}

这是Silverlight客户端方法:

context.Load(context.GetUserRolesQuery(),loadOp =>
{
    IEnumerable<UserRole> roles = loadOp.Entities;
    // This should show 2,but shows 0:
    MessageBox.Show("Permissions loaded: " + roles.First().UserPermissions.Count.ToString());
}

有没有人知道任何可能导致这些包含实体丢失的事情?我在其他几个地方做同样的事情,他们工作.

解决方法

好的,解决了!我看一下使用 Fiddler在服务器和客户端之间传递的序列化数据,发现所有嵌套类型实际上都被传递但是它们之间的关系不正确.经过一些修补,思考和在线研究后,发现EF中的多对多关系无法按预期工作,如果您依靠中间表来管理关系,则需要将这些关系包含在模型.

为了让我的应用程序工作,我做了以下事情:

1)通过添加主键标识列,进入数据库并更新中间表(管理多对多关系的表).添加完成后,EF生成的模型将在更新时包含这些表.

2)为了彻底消灭我现有的模型,我使用了在DB中重命名表格,更新模型,重新命名数据库表格,然后再次更新并选择我想要添加的表格的技巧.这可能是矫枉过正,但由于我过去遇到的问题,我发现这是确保表格完全干净的最佳方法.

3)我必须为新的中间类型添加所有元数据类,以及更新现有类型的元数据类.我写了一个VS片段(类型’meta’)来更快地添加这些类.您可以下载安装程序here.

4)除了添加/更新所有现有元数据类之外,还需要确保所有’AssociationAttributes’都使用中间类型并指定外键属性:

[MetadataTypeAttribute(typeof(UserPermissionMembers.UserPermissionMembersMetadata))]
public partial class UserPermissionMembers
{
    internal sealed class UserPermissionMembersMetadata
    {
        private UserPermissionMembersMetadata()
        {}

        public int ID;
        public UserRole UserRole;

        [Include]
        [Association("UserPermission","fkPermissionID","PermissionID",IsForeignKey = true)]
        public UserPermission UserPermission;
    }
}

5)我用新结构更新了域服务方法:

public IEnumerable<UserRole> GetUserRoles()
{
    IEnumerable<UserRole> roles = this.ObjectContext.UserRole.Include("UserPermissionMembers.UserPermission");
    return roles;
}

6)我更新了客户端方法以使用新类型.

context.Load(context.GetUserRolesQuery(),loadOp =>
{
    IEnumerable<UserRole> roles = loadOp.Entities;
    MessageBox.Show("Permissions loaded: " + roles.First().UserPermissionMembers.Count.ToString());
}

注意:即使知道问题,仍然需要一段时间才能正确配置所有AssociationAttributes,以便它们引用正确的属性.如果您遇到问题,我建议您仔细检查一下.

对于应该更优雅的东西来说,这是一件很痛苦的事情.我还没有看过EF v4,但我希望它能改善这一切.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读