【问题标题】:Fluent NHibernate mapping throws an exception of 'Id is not mapped'Fluent NHibernate 映射引发“Id 未映射”异常
【发布时间】:2015-02-13 10:37:47
【问题描述】:

我需要有关 Fluent Nhibernate 中自动映射的帮助。这是我想在我的应用程序中拥有的表(它们很多,但我只想从映射其中的几个开始)

好吧,我想使用AutoMapping 功能,因为我不想为超过 100 个表编写映射类...

不管怎样,这里是创建SessionFactory时抛出的错误(代码在文末)

实体“FilterConfig”没有映射 ID。
使用 Id 方法映射您的身份属性。例如:Id(x => x.Id)。

实体(我希望我正确地创建了它们):

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

配置:

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

【问题讨论】:

    标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping


    【解决方案1】:

    在您所说的配置中,ID 的名称类似于UserLoginID,但在类中它们被定义为public virtual int ID { get; set; },因此请更改

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

    return member.Name == "ID";
    

    一些附加信息:

    • CreateAutomappings() 好像没用过
    • AutomappingConfiguration 至少应覆盖 ShouldMap(Member) 以过滤命名空间(例如 member.Namespace.StartsWith(typeof(UserMessage).Namespace)),否则迟早也会映射实用程序类等
    • AutoMap.AssemblyOf 应按包含类型而不是按类型的程序集调用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2011-07-11
      • 2012-04-03
      • 1970-01-01
      • 2012-10-19
      相关资源
      最近更新 更多