简体   繁体   English

流利:名称空间中的子元素“多对一”无效

[英]Fluent: has invalid child element 'many-to-one' in namespace

I'm trying to map myexisting database by Fluent NHibernate I get error: 我正在尝试通过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'."}

I'm newbie in Fluent and I don't know how to fix it ? 我是Fluent的新手,不知道如何解决? (maybe it is because id is string ?) (也许是因为id是string吗?)

Here is my model class: 这是我的模型课:

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");
        }


    }
}

I have only one classMap 我只有一个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");
        }
    }
}

This is script to create my table( it already exists): 这是创建我的表的脚本(它已经存在):

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]

Instead of relying on 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();

        }

Try this: 尝试这个:

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();
}

Also you might need to make the User properties virtual. 另外,您可能需要将User属性设置为虚拟。


And here's a full working example using SQLite that I've put to illustrate sample configuration: 这是一个使用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();
        }
    }
}

My guess is that you are trying to use AutoMapping but you are pointing the auto-mapper at your mapping namespace not your model. 我的猜测是您正在尝试使用自动映射,但是您将自动映射器指向了映射名称空间而不是模型。 This results in FNH trying to automap your actual mapping classes. 这导致FNH尝试自动映射您的实际映射类。 You could point AutoMap at your model namespace, but looking at your code you may run into more difficulties. 您可以将AutoMap指向模型名称空间,但查看代码可能会遇到更多困难。 It's probably better at this stage to use the normal, non-auto mapper. 在现阶段最好使用正常的非自动映射器。

I'm guessing you're running an out-of-date version of Fluent NHibernate; 我猜您正在运行的是Fluent NHibernate的过时版本。 if you were running 1.1, you would get a more helpful exception. 如果您运行的是1.1,则会得到一个更有帮助的异常。 90% of the time you (used to) get that exception when your class doesn't have an Id mapped. 当您的类没有ID映射时,您(过去)有90%的时间获得了该异常。

I'm fairly sure the automapper isn't finding your Id properties. 我相当确定自动映射器没有找到您的ID属性。 First, you're getting that exception; 首先,您遇到了异常; second, your ClassMap shows you're using a property named IdUser as the Id in that entity; 其次,您的ClassMap显示您正在使用名为IdUser的属性作为该实体中的ID; third, the automapper is configured by default to search for properties called Id only. 第三,默认情况下将自动映射器配置为仅搜索称为Id属性。

I suggest you read the automapping wiki page , as it covers all these things. 我建议您阅读automapping wiki页面 ,因为它涵盖了所有这些内容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM