0
votes

I need help with auto mapping in Fluent Nhibernate. Here's the tables I want to have in my app (they are many of them, but I want to start from mapping only a few of them)

Well, I'd like to use the AutoMapping functionality because I don't want to write the mapping classes for more than 100 tables...

Anyway, here's the error thrown when creating the SessionFactory (the code is at the end of this post)

The entity 'FilterConfig' doesn't have an Id mapped.
Use the Id method to map your identity property. For example: Id(x => x.Id).

enter image description here

Entities (I hope I created them correctly):

public partial class UserLogin
{
    public UserLogin()
    {
        this.UserMessages = new List<UserMessage>();
        this.UserMessagesReceivers = new List<UserMessagesReceiver>();
    }

    public virtual int ID { get; set; }
    public virtual int UserTypeID { get; set; }
    public virtual int? StudentID { get; set; }
    public virtual int? HeadmasterID { get; set; }
    public virtual int? ParentID { get; set; }
    public virtual string UniqueID { get; set; }
    public virtual bool ShowMyPhoneNumber { get; set; }
    public virtual bool IsBanned { get; set; }
    public virtual string Login { get; set; }
    public virtual string Password { get; set; }
    public virtual bool WasPasswordSent { get; set; }
    public virtual string Email { get; set; }
    public virtual string UserPicture { get; set; }
    public virtual IList<UserMessage> UserMessages { get; set; }
    public virtual IList<UserMessagesReceiver> UserMessagesReceivers { get; set; }
}

public partial class UserMessage
{
    public UserMessage()
    {
        this.UserMessagesReceivers = new List<UserMessagesReceiver>();
        this.UserMessagesReplies = new List<UserMessagesReply>();
    }

    public virtual int ID { get; set; }
    public virtual DateTime Date { get; set; }
    public virtual DateTime? LastCheckDate { get; set; }
    public virtual int UserLoginID { get; set; }
    public virtual string Description { get; set; }
    public virtual bool HasNonCheckedReplies { get; set; }
    public virtual UserLogin UserLogin { get; set; }
    public virtual IList<UserMessagesReceiver> UserMessagesReceivers { get; set; }
    public virtual IList<UserMessagesReply> UserMessagesReplies { get; set; }
}

public partial class UserMessagesReceiver
{
    public UserMessagesReceiver()
    {
        this.WasMessageChecked = false;
        this.UserMessagesReplies = new List<UserMessagesReply>();
    }

    public virtual int ID { get; set; }
    public virtual int UserMessagesID { get; set; }
    public virtual int ReceiverLoginID { get; set; }
    public virtual bool WasMessageChecked { get; set; }
    public virtual DateTime? LastCheckedDate { get; set; }
    public virtual UserLogin UserLogin { get; set; }
    public virtual UserMessage UserMessage { get; set; }
    public virtual IList<UserMessagesReply> UserMessagesReplies { get; set; }
}

public partial class UserMessagesReply
{
    public UserMessagesReply()
    {
    }

    public virtual int ID { get; set; }
    public virtual DateTime Date { get; set; }
    public virtual int UserMessagesID { get; set; }
    public virtual int? UserMessagesReceiverID { get; set; }
    public virtual string Description { get; set; }
    public virtual UserMessage UserMessage { get; set; }
    public virtual UserMessagesReceiver UserMessagesReceiver { get; set; }
}

Configuration:

    public class AutomappingConfiguration : DefaultAutomappingConfiguration
    {
        public override bool IsId(Member member)
        {
            return member.Name == member.DeclaringType.Name + "ID";
        }
    }

    private static AutoPersistenceModel CreateAutomappings()
    {
        return AutoMap.AssemblyOf<AutomappingConfiguration>(new AutomappingConfiguration());
    }

    private static ISessionFactory CreateSessionFactory()
    {
        var cfg = new AutomappingConfiguration();
        return Fluently.Configure()
                       .Database(MySQLConfiguration.Standard
                       .ConnectionString("..."))
                       .Mappings(m => m.AutoMappings
                                       .Add(AutoMap.AssemblyOf<UserLogin>(cfg))
                                       .Add(AutoMap.AssemblyOf<UserMessage>(cfg))
                                       .Add(AutoMap.AssemblyOf<UserMessagesReceiver>(cfg))
                                       .Add(AutoMap.AssemblyOf<UserMessagesReply>(cfg)))
                       .BuildSessionFactory();
    }
1

1 Answers

1
votes

in the configuration you said that the Ids are named like UserLoginID but in the class they are defined as public virtual int ID { get; set; } so change

return member.Name == member.DeclaringType.Name + "ID";

to

return member.Name == "ID";

Some additional info:

  • CreateAutomappings() seems to be not used
  • AutomappingConfiguration should at least override ShouldMap(Member) to filter on the namespace (e.g. member.Namespace.StartsWith(typeof(UserMessage).Namespace)) otherwise sooner or later utility classes and the like will be mapped as well
  • AutoMap.AssemblyOf<> should be called per assembly containing types not per type