Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate S#arp体系结构中的一对一映射_Nhibernate_Fluent Nhibernate_S#arp Architecture_Automapping - Fatal编程技术网

Nhibernate S#arp体系结构中的一对一映射

Nhibernate S#arp体系结构中的一对一映射,nhibernate,fluent-nhibernate,s#arp-architecture,automapping,Nhibernate,Fluent Nhibernate,S#arp Architecture,Automapping,我头上有一股明显的烧坏电路的气味,所以请原谅我的无知 我试图在S#arp架构中建立一对一的关系(好吧,让Automapper来做) 我有 public class User : Entity { public virtual Profile Profile { get; set; } public virtual Basket Basket { get; set; } public virtual IList<Order> Orders { get; set;

我头上有一股明显的烧坏电路的气味,所以请原谅我的无知

我试图在S#arp架构中建立一对一的关系(好吧,让Automapper来做)

我有

public class User : Entity
{
    public virtual Profile Profile { get; set; }
    public virtual Basket Basket { get; set; }
    public virtual IList<Order> Orders { get; set; }
    public virtual IList<Role> Roles { get; set; }  
    ...
}

public class Basket : Entity
{
    public virtual User User { get; set; }  
    ...
}

public class Profile : Entity
{
    public virtual User User { get; set; }
    ...
}
在MappingIntegrationTests中运行单元测试CanConfigDatabaseMatchesMappings时,出现以下错误

NHibernate.ADOException:无法 执行查询。。。 System.Data.SqlClient.SqlException: 列名“ProfileFk”无效。 列名“BasketFk”无效

它试图执行的sql是

SELECT TOP 0
    this_.Id AS Id6_1_ ,
    ..
    user2_.ProfileFk AS ProfileFk9_0_ ,
    user2_.BasketFk AS BasketFk9_0_
FROM
    Profiles this_
    LEFT OUTER JOIN Users user2_
        ON this_.UserFk = user2_.Id
所以它在用户表中查找ProfileFk和BasketFk字段。 我没有设置任何客户覆盖映射,就我所见,我遵循了S#中设置的默认约定

IList订单和角色的另外两个映射似乎映射得很好。所以我猜它错过了建立一对一关系的机会


我错过了什么

明白了。这确实是一个使用流畅的NHibernate语法来解决的NHibernate问题,但它恰好与S#有关

背景资料:及

您要做的是覆盖用户的映射,并为其提供两个.HasOne映射。然后在Profile和Basket类上为用户设置唯一的引用:

public class UserMap : IAutoMappingOverride<User>
    {
        #region Implementation of IAutoMappingOverride<User>
        /// <summary>
        /// Alter the automapping for this type
        /// </summary>
        /// <param name="mapping">Automapping</param>
        public void Override(AutoMapping<User> mapping)
        {
            mapping.HasOne(u => u.Profile);
            mapping.HasOne(u => u.Basket);
        }
        #endregion
    }

public class ProfileMap : IAutoMappingOverride<Profile>
    {
        #region Implementation of IAutoMappingOverride<Profile>
        /// <summary>
        /// Alter the automapping for this type
        /// </summary>
        /// <param name="mapping">Automapping</param>
        public void Override(AutoMapping<Profile> mapping)
        {
            mapping.References(p => p.User).Unique().Column("UserFk");
        }
        #endregion
    }

public class BasketMap : IAutoMappingOverride<Basket>
    {
        #region Implementation of IAutoMappingOverride<Basket>
        /// <summary>
        /// Alter the automapping for this type
        /// </summary>
        /// <param name="mapping">Automapping</param>
        public void Override(AutoMapping<Basket> mapping)
        {
            mapping.References(b => b.User).Unique().Column("UserFk");
        }
        #endregion
    }
public类UserMap:IAutoMappingOverride
{
#IAutoMappingOverride的区域实现
/// 
///更改此类型的自动映射
/// 
///自动映射
公共无效替代(自动映射)
{
mapping.HasOne(u=>u.Profile);
mapping.HasOne(u=>u.Basket);
}
#端区
}
公共类ProfileMap:IAutoMappingOverride
{
#IAutoMappingOverride的区域实现
/// 
///更改此类型的自动映射
/// 
///自动映射
公共无效替代(自动映射)
{
mapping.References(p=>p.User.Unique().Column(“UserFk”);
}
#端区
}
公共类BasketMap:IAutoMappingOverride
{
#IAutoMappingOverride的区域实现
/// 
///更改此类型的自动映射
/// 
///自动映射
公共无效替代(自动映射)
{
mapping.References(b=>b.User.Unique().Column(“UserFk”);
}
#端区
}

作为旁注,在撰写本文时,NHibernate 3刚刚发布。我刚买了一本很棒的书,它看起来对s#非常有用。

。。。我觉得您甚至不需要.HasOne映射(因为实际上这些是多对一关系)
public class UserMap : IAutoMappingOverride<User>
    {
        #region Implementation of IAutoMappingOverride<User>
        /// <summary>
        /// Alter the automapping for this type
        /// </summary>
        /// <param name="mapping">Automapping</param>
        public void Override(AutoMapping<User> mapping)
        {
            mapping.HasOne(u => u.Profile);
            mapping.HasOne(u => u.Basket);
        }
        #endregion
    }

public class ProfileMap : IAutoMappingOverride<Profile>
    {
        #region Implementation of IAutoMappingOverride<Profile>
        /// <summary>
        /// Alter the automapping for this type
        /// </summary>
        /// <param name="mapping">Automapping</param>
        public void Override(AutoMapping<Profile> mapping)
        {
            mapping.References(p => p.User).Unique().Column("UserFk");
        }
        #endregion
    }

public class BasketMap : IAutoMappingOverride<Basket>
    {
        #region Implementation of IAutoMappingOverride<Basket>
        /// <summary>
        /// Alter the automapping for this type
        /// </summary>
        /// <param name="mapping">Automapping</param>
        public void Override(AutoMapping<Basket> mapping)
        {
            mapping.References(b => b.User).Unique().Column("UserFk");
        }
        #endregion
    }