Свободно: имеет недопустимый дочерний элемент «многие-к-одному» в пространстве имен - PullRequest
2 голосов
/ 03 сентября 2010

Я пытаюсь сопоставить мою существующую базу данных с помощью Fluent NHibernate. Я получаю сообщение об ошибке:

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'."}

Я новичок в Fluent и не знаю, как это исправить?(может быть, это потому, что 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 = "adamm@wp.pl",
                                         _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");
        }


    }
}

У меня есть только один classMap

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]

Ответы [ 3 ]

1 голос
/ 08 сентября 2010

Вместо того, чтобы полагаться на autoppings:

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 = "adamm@wp.pl",
                });
                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 голосов
/ 06 сентября 2010

Я предполагаю, что вы используете устаревшую версию Fluent NHibernate;если бы вы работали с 1.1, вы бы получили более полезное исключение.90% случаев, когда вы (раньше) получали это исключение, когда у вашего класса нет сопоставленного идентификатора.

Я вполне уверен, что автопроизводитель не находит ваши свойства идентификатора.Во-первых, вы получаете это исключение;во-вторых, ваш ClassMap показывает, что вы используете свойство с именем IdUser в качестве идентификатора в этой сущности;в-третьих, автоматический преобразователь по умолчанию настроен на поиск свойств, называемых только Id.

Я предлагаю вам прочитать вики-страницу *, которая охватывает все эти вещи.

0 голосов
/ 05 сентября 2010

Я предполагаю, что вы пытаетесь использовать AutoMapping, но вы указываете auto-mapper на ваше пространство имен отображения, а не на вашу модель.Это приводит к тому, что FNH пытается автоматизировать ваши фактические классы отображения.Вы можете указать AutoMap на пространство имен вашей модели, но, глядя на ваш код, вы можете столкнуться с большими трудностями.Возможно, на данном этапе лучше использовать обычный неавтоматический картограф.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...