![](/img/trans.png)
[英]The type xxx was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically
[英]“The type RoleProxy was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.” NHibernate
因此,如標題所述:我收到一條錯誤消息,其中指出:“ 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; }
}
}
Role.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");
}
}
}
SessionFactory:
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;
}
}
}
有人知道是什么問題嗎? 幫助將不勝感激!
您沒有告訴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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.