c# Nhibernate查询不工作

本文关键字:工作 查询 Nhibernate | 更新日期: 2023-09-27 18:06:32

我刚开始学习c#和Nhibernate。我花了好几个小时来解决这个问题。

有人看到问题了吗?

<

表strong>行:

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

表strong> 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);
        }
}

对于我执行的每个查询,我都得到类似

的内容
类型的未处理异常"NHibernate.Exceptions。

在NHibernate.dll中发生GenericADOException

附加信息:could not execute query

或NULL。

c# Nhibernate查询不工作

你的代码有两个问题:

  • 实体命名为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");
        }
}

实体代表表(或类似表的表)。

"color"不需要一个表(和实体/地图)。你不需要为Color创建一个类。

Line需要有一个属性和一个映射属性"color"

Hibernate指责的问题是,因为它不能匹配任何表的实体颜色