【问题标题】:"The type RoleProxy was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically." NHibernate“类型 RoleProxy 不是预期的。使用 XmlInclude 或 SoapInclude 属性来指定静态未知的类型。”休眠
【发布时间】:2014-12-09 15:55:32
【问题描述】:

正如标题所说:我收到一个错误,上面写着:“System.InvalidOperationException:生成 XML 文档时出错。---> System.InvalidOperationException:类型 RoleProxy 不是预期的。使用 XmlInclude 或 SoapInclude属性来指定静态未知的类型。”

我正在尝试将数据库中的用户列表作为 Web 服务中的 XML 返回(密码除外)。

这里有一些代码:

MS SQL Server 数据库:

用户表:

CREATE TABLE [dbo].[Users] (
    [Id]       NVARCHAR (50) NOT NULL,
    [Username] NVARCHAR (50) NULL,
    [Password] NVARCHAR (50) NOT NULL,
    [Role]     NVARCHAR (50) NOT NULL,
    CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Users_Role] FOREIGN KEY ([Role]) REFERENCES [dbo].[Role] ([Id])
);

角色表:

CREATE TABLE [dbo].[Role] (
    [Id]   NVARCHAR (50) NOT NULL,
    [Name] NVARCHAR (50) NULL,
    CONSTRAINT [PK_Role] PRIMARY KEY CLUSTERED ([Id] ASC)
);

WebService.cs

using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Services;
using NHibernate;
using Models;
using NHibernate.Mapping;

[WebService(Namespace = "http://LambdAlarm.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class LambdAlarmWebService : WebService
{
    [WebMethod]
    public List<Users> GetUser()
    {
        var factory = SessionFactory.Instance;
        var session = factory.OpenSession();
        var result = session.QueryOver<Users>().List<Users>();

        return result.ToList(); //Where I suspect the error occurs.
    }
}

Users.cs(模型)

namespace Models
{
    public class Users : EntityBase
    {
        public virtual string Username { get; set; }
        public virtual string Password { get; set; }
        public virtual Role Role { get; set; }
    }
}

角色.cs:

namespace Models
{
    public class Role : EntityBase
    {
        public virtual string Name { get; set; }
    }
}

EntityBase:(具有在所有模型中继承的属性 guid 的类)

using System;

namespace Models
{
    public class EntityBase
    {
        public virtual Guid Id { get; set; }
    }
}

用户地图:

using FluentNHibernate.Mapping;
using Models;

namespace NHibernate.Mapping
{
    public class UserMap : ClassMap<Users>
    {
        public UserMap()
        {
            Table("Users");
            Id(x => x.Id).GeneratedBy.GuidComb();
            LazyLoad();
            References(x => x.Role).Column("Role");
            Map(x => x.Username).Column("Username");
            Map(x => x.Password).Column("Password").Not.Nullable();
        }
    }
}

角色映射:

using FluentNHibernate.Mapping;
using Models;

namespace NHibernate.Mapping
{
    public class RoleMap : ClassMap<Role>
    {
        public RoleMap()
        {
            Table("Role");
            Id(x => x.Id).GeneratedBy.GuidComb();
            LazyLoad();
            Map(x => x.Name).Column("Name");
        }
    }
}

会话工厂:

using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using Models;
using NHibernate.Conventions;

namespace NHibernate
{
    public static class SessionFactory
    {
        private static ISessionFactory _sessionFactory;

        public static ISessionFactory Instance
        {
            get
            {
                if (_sessionFactory == null)
                {
                    _sessionFactory = CreateSessionFactory();
                }

                return _sessionFactory;
            }
        }

        private static ISessionFactory CreateSessionFactory()
        {
            return Fluently.Configure()
                        .Database(MsSqlConfiguration.MsSql2012
                            .ConnectionString(c => c.FromConnectionStringWithKey("DatabaseConnectionString")))
                        .Mappings(m =>
                        {
                            m.FluentMappings.Conventions.AddFromAssemblyOf<CustomForeignKeyConvention>();
                            m.FluentMappings.AddFromAssemblyOf<EntityBase>();
                        })
                        .BuildSessionFactory();
        }
    }
}

约定:

using FluentNHibernate;
using FluentNHibernate.Conventions;

namespace NHibernate.Conventions
{
    public class CustomForeignKeyConvention : ForeignKeyConvention
    {
        protected override string GetKeyName(Member property, System.Type type)
        {
            if (property == null)
            {
                return type.Name;
            }

            return property.Name;
        }
    }
}

有人知道问题出在哪里吗?帮助将不胜感激!

【问题讨论】:

    标签: c# .net sql-server web-services nhibernate


    【解决方案1】:

    你没有告诉 NHibernate 你需要什么,所以它会延迟加载所有引用对象。但是,这将生成代理。也将阻止 SELECT N+1 的最简单的解决方案是急切加载角色。也摆脱了结果列表的冗余复制。

    [WebMethod]
    public List<Users> GetUser()
    {
        var factory = SessionFactory.Instance;
        using (var session = factory.OpenSession())
        {
            return session.QueryOver<Users>().Fetch(u => u.Role).List();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-06
      • 2020-07-20
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多