2010-09-02 47 views
2

我试图用流利的NHibernate映射myexisting数据库,我得到错误:流利的:具有无效子元素'多到一个人在命名空间

The element 'class' in namespace 'urn:nhibernate-mapping-2.2' has invalid child element 'many-to-one' in namespace 'urn:nhibernate-mapping-2.2'. List of possible elements expected: 'meta, subselect, cache, synchronize, comment, tuplizer, id, composite-id' in namespace 'urn:nhibernate-mapping-2.2'."} 

我在流利的新手,我不不知道如何解决它? (也许是因为id为字符串?)

这里是我的模型类:

namespace Server.Model 
{ 
    public partial class User 
    { 
     string _name; 

     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 
     string _email; 

     public string Email 
     { 
      get { return _email; } 
      set { _email = value; } 
     } 
     TypeOfUser _typeOfUser; 

     public TypeOfUser TypeOfUser 
     { 
      get { return _typeOfUser; } 
      set { _typeOfUser = value; } 
     } 
     string _idUser; 

     public string IdUser 
     { 
      get { return _idUser; } 
      set { _idUser = value; } 
     } 

     public string Password { get; set; } 

     public static void AddUserTest() 
     { 
      var sessionFactory = BuildSessionFactory(); 

      using (ISession session = sessionFactory.OpenSession()) 
      { 

       using (ITransaction transaction = session.BeginTransaction()) 
       { 

        session.Save(new User() 
            { 
             _idUser = "adapol", 
             _name = "Adam Mickiewicz", 
             _email = "[email protected]", 
             _typeOfUser = Model.TypeOfUser.NormalUser 
            }); 
       } 
      } 
     } 

     private static ISessionFactory BuildSessionFactory() 
     { 
      AutoPersistenceModel model = CreateMappings(); 

      return Fluently.Configure().Database(MsSqlConfiguration.MsSql2005 
    .ConnectionString(c => c.FromConnectionStringWithKey("gwd"))).Mappings(m => m.AutoMappings.Add(model)) 
    .ExposeConfiguration((Configuration config) => new SchemaExport(config).Create(false, true)).BuildSessionFactory(); 

     } 

     private static AutoPersistenceModel CreateMappings() 
     { 
      return AutoMap 
       .Assembly(System.Reflection.Assembly.GetCallingAssembly()) 
       .Where(t => t.Namespace == "Server.Mappings"); 
     } 


    } 
} 

我只有一个类映射

namespace Server.Mappings 
{ 
    public class UserMap : ClassMap<User> 
    { 
     public UserMap() 
     { 
      Table("Users"); 

      Id(x => x.IdUser,"IdUser"); 
      Map(x => x.Email); 
      Map(x => x.Name); 
      Map(x => x.Password); 
      Map(x => x.TypeOfUser,"Type"); 
     } 
    } 
} 

这是脚本来创建我的表(它已经存在):

USE [GWD] 
GO 
/****** Object: Table [dbo].[Users] Script Date: 09/02/2010 23:08:02 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Users](
    [IDuser] [nvarchar](50) NOT NULL, 
    [Type] [int] NOT NULL, 
    [Name] [nvarchar](max) NOT NULL, 
    [Email] [nvarchar](50) NOT NULL, 
    [Password] [nvarchar](50) NOT NULL, 
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
(
    [IDuser] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

回答

1

而不是依靠automappings的:

private static ISessionFactory BuildSessionFactory() 
     { 
      AutoPersistenceModel model = CreateMappings(); 

      return Fluently.Configure().Database(MsSqlConfiguration.MsSql2005 
    .ConnectionString(c => c.FromConnectionStringWithKey("gwd"))).Mappings(m => m.AutoMappings.Add(model)) 
    .ExposeConfiguration((Configuration config) => new SchemaExport(config).Create(false, true)).BuildSessionFactory(); 

     } 

试试这个:

private static ISessionFactory BuildSessionFactory() 
{ 
    return Fluently 
     .Configure() 
     .Database(
      MsSqlConfiguration 
       .MsSql2005 
       .ConnectionString(c => c.FromConnectionStringWithKey("gwd")) 
     ) 
     .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>()) 
     .ExposeConfiguration(config => new SchemaExport(config).Create(false, true)) 
     .BuildSessionFactory(); 
} 

你也可能需要做出User性虚。


而这里的使用SQLite,我已经把来展示配置一个完整的工作示例:

public class User 
{ 
    public virtual string IdUser { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Email { get; set; } 
    public virtual string Password { get; set; } 
} 

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Table("Users"); 
     Id(x => x.IdUser); 
     Map(x => x.Email); 
     Map(x => x.Name); 
     Map(x => x.Password); 
    } 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 
     if (File.Exists("data.db3")) 
     { 
      File.Delete("data.db3"); 
     } 

     using (var factory = CreateSessionFactory()) 
     { 
      using (var connection = factory.OpenSession().Connection) 
      { 
       ExecuteQuery("create table Users(IdUser string primary key, Name string, Email string, Password string)", connection); 
      } 

      using (var session = factory.OpenSession()) 
      using (var tx = session.BeginTransaction()) 
      { 
       session.Save(new User() 
       { 
        IdUser = "adapol", 
        Name = "Adam Mickiewicz", 
        Email = "[email protected]", 
       }); 
       tx.Commit(); 
      } 
     } 
    } 

    private static ISessionFactory CreateSessionFactory() 
    { 
     return Fluently.Configure() 
      .Database(
       SQLiteConfiguration.Standard.UsingFile("data.db3").ShowSql() 
      ) 
      .Mappings(
       m => m.FluentMappings.AddFromAssemblyOf<UserMap>() 
      ) 
      .BuildSessionFactory(); 
    } 

    static void ExecuteQuery(string sql, IDbConnection connection) 
    { 
     using (var command = connection.CreateCommand()) 
     { 
      command.CommandText = sql; 
      command.ExecuteNonQuery(); 
     } 
    } 
} 
0

我的猜测是,您正在尝试使用AutoMapping,但是您将自动映射器指向您的mappi ng命名空间不是你的模型。这导致FNH试图自动映射您的实际映射类。 您可以将AutoMap指向模型名称空间,但查看代码可能会遇到更多困难。 在这个阶段使用普通的非自动映射器可能会更好。

0

我猜你正在运行一个过时的版本的流利NHibernate的;如果你运行的是1.1,你会得到一个更有帮助的例外。当你的班级没有映射Id时,90%的时间(习惯)会得到这个例外。

我很确定automapper没有找到你的Id属性。首先,你得到了这个例外;第二,您的ClassMap显示您正在使用名为IdUser的媒体资源作为该实体中的ID;第三,自动映射器默认配置为仅搜索名为Id的属性。

我建议你阅读automapping wiki page,因为它涵盖了所有这些东西。

相关问题