nhibernate - NHibernate的复合键/ID映射

标签 nhibernate fluent-nhibernate nhibernate-mapping composite-key composite-id

我的数据库中有以下表格:

Announcements:
- AnnouncementID (PK)
- Title

AnouncementsRead (composite PK on AnnouncementID and UserID):
- AnnouncementID (PK)
- UserID (PK)
- DateRead

Users:
- UserID (PK)
- UserName


通常,我会使用多对多关系来映射“ AnnouncementsRead”,但此表还具有一个附加的“ DateRead”字段。

到目前为止,我已经定义了以下实体:

    public class Announcement
    {
        public virtual int AnnouncementID { get; set; }
        public virtual string Title { get; set; }
        public virtual IList<AnnouncementRead> AnnouncementsRead { get; private set; }

        public Announcement()
        {
            AnnouncementsRead = new List<AnnouncementRead>();
        }
    }

    public class AnnouncementRead
    {
        public virtual Announcement Announcement { get; set; }
        public virtual User User { get; set; }
        public virtual DateTime DateRead { get; set; }
    }

    public class User
    {
        public virtual int UserID { get; set; }
        public virtual string UserName { get; set; }
        public virtual IList<AnnouncementRead> AnnouncementsRead { get; private set; }

        public User()
        {
            AnnouncementsRead = new List<AnnouncementRead>();
        }
 }


使用以下映射:

public class AnnouncementMap : ClassMap<Announcement>
{
    public AnnouncementMap()
    {
        Table("Announcements");
        Id(x => x.AnnouncementID);
        Map(x => x.Title);
        HasMany(x => x.AnnouncementsRead)
            .Cascade.All();
    }
}

public class AnnouncementReadMap : ClassMap<AnnouncementRead>
{
    public AnnouncementReadMap()
    {
        Table("AnnouncementsRead");
        CompositeId()
            .KeyReference(x => x.Announcement, "AnnouncementID")
            .KeyReference(x => x.User, "UserID");
        Map(x => x.DateRead);
    }
}

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Table("Users");
        Id(x => x.UserID);
        Map(x => x.UserName);
        HasMany(x => x.AnnouncementsRead)
            .Cascade.All();
    }
}


但是,当我运行此程序时,出现以下错误:

"composite-id class must override Equals(): Entities.AnnouncementRead"


如果有人能指出我正确的方向,我将不胜感激。谢谢

最佳答案

您应该执行NHibernate告诉您的操作。 AnnouncementRead应该覆盖EqualsGetHashCode方法。它们应基于作为主键一部分的字段

关于nhibernate - NHibernate的复合键/ID映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3439155/

相关文章:

c# - 一对一和泛型 : "Association references unmapped class"

c# - 在 nHibernate 中为泛型类建模的最佳方式

c# - NHibernate 在具有复合键的遗留数据库中一对一

c# - Linq to nhibernate - 其中集合包含具有 id 的对象

c# - Fluent nHibernate - 如何选择没有时间的 DISTINCT 日期?

fluent-nhibernate - 如何使用 fluent-nhibernate 更改多列索引中的列顺序?

nhibernate - 索引 View 和 Nhibernate - NOEXPAND 提示?

c# - NHibernate - 它是否适用于外键约束的数据库级级联删除

c# - nHibernate,将两个属性映射到同一个类

c# - NHibernate:读取 mysql Blob 字段 - 值返回为 "System.Byte[]"