【问题标题】:Fluent NHibernate has many mapping where child table has not primary keyFluent NHibernate 有许多映射,其中子表没有主键
【发布时间】:2010-07-30 03:07:54
【问题描述】:

所以我已经使用 NHibernate 几个星期了,所以请多多包涵。我正在处理一个有很多奇怪问题的遗留数据库。

我有一个名字对象

public class Name    {    
        public Name()
        {
            Addresses = new List<Address>();
        }    
        public virtual string Id { get; set; }
        public virtual string FirstName { get; set; }    
        public virtual string LastName { get; set; }     
        public virtual IList<NameAddress> Addresses { get; set; }    
}

它有地址的孩子

public class Address 
{
        public virtual string NameId { get; set; }
        public virtual string Line1 { get; set; }
        public virtual string City { get; set; }
        public virtual string State { get; set; }
        public virtual string Zipcode { get; set; }
        public virtual string Type { get; set; }
        public virtual bool IsPreferrred { get; set; }
}

这里是映射 Address 没有定义主键,但 name_id 和 type 使其唯一。您看到的列是表结构。

   Table("ADDRESS");
    CompositeId()
            .KeyProperty(x => x.NameId, "NAME_ID")
            .KeyProperty(x => x.Type, "ADDRESS_TYPE");
    Map(x => x.IsPreferred)
        .Column("PREF");
    Map(x => x.Line1)
        .Column("ADDRESS1");
    Map(x => x.Line2)
        .Column("ADDRESS2");
    Map(x => x.City)
        .Column("CITY");
    Map(x => x.State)
        .Column("STATE");

名称 表(“名称”);

        Id(x => x.Id)
            .GeneratedBy.Custom<XXIdentifierGenerator>(p => p.AddParam("prefix", "NAME"))
            .Column("NAME_ID");
        Map(x => x.Prefix)               
            .Column("NAME_PRE");
        Map(x => x.FirstName)
            .Column("NAME_FIRST");
        HasMany(x => x.Addresses)
            .KeyColumn("NAME_ID")
            .Table("ADDRESS")
            .LazyLoad();

我可以创建一个没有任何地址的名称并取回生成的 ID。

 repository.Save(name); // only calls session.Save and does a commit 
 Address address = new NameAddress {IsPreferred = true, Type= "Home", Line1 = "123 Main St",
                                    City = "Anytown", State = "CT", Zipcode="06512" };
 name.Addresses.Add(address);
 repository.SaveOrUpdate(name);

当我尝试保存地址时出现异常

     {"Unexpected row count: 0; expected: 1"}

我不确定

  1. 我的映射错误
  2. 我不明白如何连接一个有很多
  3. 没有主键我无法做到这一点
  4. 在这种情况下,地址是否必须自己保存?

谢谢, 保罗

【问题讨论】:

    标签: nhibernate fluent-nhibernate persistence


    【解决方案1】:

    这有点像在黑暗中拍摄,但是在NameHasMany(x =&gt; x.Addresses) 映射上添加.Cascade.All 或类似内容怎么样?

    我想 NHibernate 需要知道您希望插入新地址和新名称。

    【讨论】:

    • Jay,我刚刚尝试了级联,但没有成功。我在保存您提到的名称之前添加了地址。如果您查看代码,我正在尝试做的是模拟创建一个新名称并稍后添加一个地址。无论哪种方式,我仍然得到错误。
    • @Paul 如果您在Address 上明确设置NAME_ID,它会起作用吗?
    • 它正在尝试更新地址,而不是插入。这是它生成的sql。它并没有抓住其他价值。更新地址集 NAME_ID = :p0 WHERE NAME_ID = :p1 AND ADDRESS_TYPE = :p2;:p0 = 'N00052046505', :p1 = 'N00052046505', :p2 = 'Home'
    • @Paul 好的,我从错误消息中认为 NHibernate 正在尝试 UPDATE Address 而不是 INSERT,因为标识符已有效分配(而 NH 没有知道地址是否是新的)。当它尝试更新时,它没有找到匹配的行,而不是它预期的 1。我对分配的复合 ID 没有太多经验,但我知道您可以在映射中指定一个未保存的值,NHibernate 可以依靠该值从持久实例中识别瞬态。我认为在 FNH 中看起来像 .UnsavedValue(null)
    • Jay,首先让我感谢您的帮助。我尝试了 Unsavedvalue(null) 并收到此错误 - {“'unsaved-value' 属性无效 - 根据其数据类型 'urn:nhibernate-mapping-2.2:unsavedValueType' 的值''无效 - 枚举约束失败."} 顺便说一句 - 他们修复了我的开发数据库,​​所以它在 nameid 和类型上有一个主键(他们把它关掉了)。他们没有的是名称表的外键。我仍然在同一条船上。
    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2011-08-31
    • 2014-05-26
    • 1970-01-01
    • 2013-03-26
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多