C#Nhibernate查询不起作用

时间:2016-09-10 14:02:00

标签: c# nhibernate fluent-nhibernate

我刚开始学习C#和Nhibernate。我试图解决以下几个小时的问题。

有人能看到问题吗?

CREATE TABLE [dbo].[Line] 
(
    [ID]       UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
    [Name]     NVARCHAR (45)    NOT NULL,
    [ID_Color] UNIQUEIDENTIFIER NULL,

    PRIMARY KEY CLUSTERED ([ID] ASC),

    UNIQUE NONCLUSTERED ([Name] ASC),

    FOREIGN KEY ([ID_Color]) 
            REFERENCES [dbo].[Line_Color] ([ID]) ON DELETE SET NULL
);

Line_Color

CREATE TABLE [dbo].[Line_Color] 
(
    [ID]    UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
    [Color] NVARCHAR (45)    NOT NULL,

    PRIMARY KEY CLUSTERED ([ID] ASC),
    UNIQUE NONCLUSTERED ([Color] ASC)
);

Entity.cs

public class Entity<T> where T : Entity<T>
{
        public virtual Guid Id { get; set; }

        private int? _oldHashCode;

        public override Boolean Equals(object obj)
        {
            var other = obj as T;

            if (other == null)
                return false;

            // handle the case of comparing two NEW objects
            var otherIsTransient = Equals(other.Id, Guid.Empty);
            var thisIsTransient = Equals(Id, Guid.Empty);

            if (otherIsTransient && thisIsTransient)
                return ReferenceEquals(other, this);

            return other.Id.Equals(Id);
        }

        public override Int32 GetHashCode()
        {
            if (_oldHashCode.HasValue)
                return _oldHashCode.Value;

            var thisIsTransient = Equals(Id, Guid.Empty);

            if (thisIsTransient)
            {
                _oldHashCode = base.GetHashCode();
                return _oldHashCode.Value;
            }

            return Id.GetHashCode();
        }

        public static Boolean operator ==(Entity<T> x, Entity<T> y)
        {
            return Equals(x, y);
        }

        public static Boolean operator !=(Entity<T> x, Entity<T> y)
        {
            return !(x == y);
        }
}

Line.cs

public class Line : Entity<Line>
{
        public virtual String Name { get; set; }
        public virtual Color Color { get; set; }
}

LineMap.cs

public class LineMap : ClassMap<Line>
{
        public LineMap()
        {
            Id(x => x.Id);
            Map(x => x.Name);
            References(x => x.Color);
        }
}

Color.cs

public class Color : Entity<Color>
{
        public virtual String ColorS { get; set; }
}

ColorMap.cs

public class ColorMap : ClassMap<Color>
{
        public ColorMap()
        {
            Id(x => x.Id);
            Map(x => x.ColorS);
        }
}

在我做的每一个查询中,我得到类似

的内容
  

未处理的类型异常   &#39; NHibernate.Exceptions.GenericADOException&#39;发生在NHibernate.dll

     

其他信息:无法执行查询

或NULL。

2 个答案:

答案 0 :(得分:1)

您的代码中存在两个问题:

  • 实体名为Color,相应的表格为Line_Color;
  • 属性的名称为ColorS,相应的列为Color

他们必须对应,或者你必须告诉NHibernate数据库名称。做一些重命名(最好)或调整你的映射。

<强> ColorMap.cs

public class ColorMap : ClassMap<Color>
{
        public ColorMap()
        {
            Table("Line_Color");
            Id(x => x.Id);
            Map(x => x.ColorS).Column("Color");
        }
}

答案 1 :(得分:0)

实体代表表格(或表格)。

您不需要“颜色”的表(和实体/地图)。 您不需要为“颜色”设置课程。

广告需要拥有属性“颜色”的属性和地图。

Hibernate的问题是因为它无法将实体颜色与任何表格匹配。