Свободное отображение NHibernate - PullRequest
1 голос
/ 15 декабря 2010

У меня есть следующие классы:

public class Entity
{
  public virtual Guid Id { get; set; }
  public virtual string EntityName { get; set; }
  public virtual IDictionary<string, Property> { get; set; }
  // ...
}

public class Property
{
  public virtual int? IntValue { get; set; }
  public virtual decimal? DecimalValue { get; set; }
}

Можно ли создать отображения Fluent NHibernate, чтобы при выполнении полученной схемы были получены следующие таблицы:

[Entities]
* Id : UNIQUEIDENTIFIER NOT NULL
* EntityName : NVARCHAR(50) NOT NULL
with a clustered index on "Id"

[Properties]
* EntityId : UNIQUEIDENTIFIER NOT NULL
* PropertyName : VARCHAR(50) NOT NULL
* IntValue : INT NULL
* DecimalValue : DECIMAL(12,6) NULL
with a clustered index on "EntityId" and "PropertyName"

Или мне нужноизменить мои классы?

Ответ будет более многословным, чем да / нет, будет высоко ценится:)

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

Помимо вашего кластерного индекса, который вам нужно будет создать вручную, да. Вам абсолютно необходим FNH для генерации вашей схемы?

Почему бы вам просто не сгенерировать схему, соответствующую вашим требованиям, а затем сопоставить ее соответственно.

(не проверено или что-либо, списано с моей головы)

public class EntityMap : ClassMap<Entity>
{
    public EntityMap()
    {
        Table("Entities");

        Id(x => x.Id).GeneratedBy.GuidComb();
        Map(x => x.Name).CustomSqlType("NVARCHAR").Length(50).Not.Nullable();
        HasMany<Property>(x => x.Properties)
            .Table("Properties")
            .KeyColumn("PropertyName")
            .Inverse()
            .AsBag();
    }
}

public class PropertyMap : ClassMap<Property>
{
    public PropertyMap()
    {
        Table("Properties");

        Id(x => x.Id).GeneratedBy.GuidComb();
        Map(x => x.PropertyName).Length(50).Not.Nullable();
        Map(x => x.IntValue);
        Map(x => x.DecimalValue);
    }
}
0 голосов
/ 16 декабря 2010

Вот сопоставление, которое я придумал:

public sealed class EntityMap : ClassMap<Entity>
{
    public EntityMap()
    {
        Table("Entities");

        Id(c => c.Id);
        Map(c => c.EntityName).CustomSqlType("nvarchar(50)").Not.Nullable();

        HasMany(c => c.Properties)
            .KeyColumn("EntityId")
            .AsMap<string>("PropertyName")
            .Component(part =>
            {
                part.Map(x => x.IntValue);
                part.Map(x => x.DecimalValue).Precision(12).Scale(6);
            });
    }
}

Генерация схемы дает следующее:

create table Entities (
   Id UNIQUEIDENTIFIER not null,
   EntityName nvarchar(50) not null,
   primary key (Id)
)

create table Properties (
   EntityId UNIQUEIDENTIFIER not null,
   IntValue INT null,
   DecimalValue DECIMAL(12, 6) null,
   PropertyName INT not null,
   primary key (EntityId, PropertyName)
)

alter table Properties 
    add constraint FK63646D8550C14DC4 
    foreign key (EntityId) 
    references Entities

Что в значительной степени мне нужно, за исключением столбцаorder (второстепенная проблема) и PropertyName nvarchar(255) вместо varchar(50) (что меня действительно волнует).

...