【发布时间】: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