NHibernate - Ошибка обезвоживания значения свойства - обновление объекта - PullRequest
0 голосов
/ 10 сентября 2018

У меня проблема при сохранении объекта с ассоциацией.Ниже приведен мой код, который выдает ошибку

Класс Fluent, унаследованный от Fluent Migration

 public override void Up()  //Update your changes to the database
 {
Create.Table("assinatura")
.WithColumn("id").AsInt32().Identity().PrimaryKey()
.WithColumn("usuario_id").AsInt32()
.WithColumn("isfreeplan").AsInt32()  //1 sim   0 nao
.WithColumn("gratuito_datafinal").AsDateTime()


Create.Table("usuarios")
.WithColumn("id").AsInt32().Identity().PrimaryKey()
.WithColumn("nomecompleto").AsString(256)     //Patricia dos Santos
.WithColumn("email").AsString(512)           //patricia@gmail.com
.WithColumn("password").AsString(128)        //123123123

Create.ForeignKey("IX_FK_AssinaturasUsuarios")
.FromTable("assinatura").ForeignColumn("usuario_id")
.ToTable("usuarios").PrimaryColumn("id");
}

Отображение таблицы "Usuario"

  public class UsuariosMap : ClassMapping<Usuario>
    {


  public enum Niveis { CADASTRADO = 0, REQUISITOU_PAGAMENTO = 1 }
        public virtual int id { get; set; }
        public virtual string nomecompleto { get; set; }
        public virtual string email { get; set; }
        public virtual string password { get; set; }

        public UsuariosMap()
        {
            Table("usuarios");
            Id(x => x.id, x => x.Generator(Generators.Identity));
            Property(x => x.nomecompleto, x => x.NotNullable(true));
            Property(x => x.email, x => x.NotNullable(true));
            Property(x => x.password, x => x.NotNullable(true));
            Bag(x => x.assinaturas, map => {
                map.Table("assinatura");
                map.Lazy(CollectionLazy.Lazy);
                map.Inverse(true);
                map.Key(k => k.Column(col => col.Name("usuario_id")));
                map.Cascade(Cascade.All); //set cascade strategy
            }, rel => rel.OneToMany());

        }

Отображение таблицы "Assinatura"

 public class Assinatura
    {
        public virtual int Id { get; set; }

        public virtual int usuario_id { get; set; }

        public virtual int isfreeplan { get; set; }
        public virtual DateTime gratuito_datafinal { get; set; }
        public virtual Usuario usuario { get; set; }

    }
   public class AssinaturaMap : ClassMapping<Assinatura>
    {
        public AssinaturaMap()
        {
            Table("assinatura");
            Id(x => x.Id, x => x.Generator(Generators.Identity));
            Property(x => x.usuario_id, x => x.NotNullable(true));
            Property(x => x.isfreeplan, x => x.NotNullable(true));
            Property(x => x.gratuito_datafinal, x => x.NotNullable(true));

            ManyToOne(x => x.usuario, x=>
            {
                x.Cascade(Cascade.DeleteOrphans);
                x.Column("usuario_id");
                x.ForeignKey("IX_FK_AssinaturasUsuarios");
            });
        }
    }

Когда я пытаюсь обновить пользователя "Usuario", добавляя новую "Assinatura", я получаю сообщение об ошибке

 var user = Database.Session.Load<Usuario>(1);
            var ass = new Assinatura
            {
                isfreeplan = 0,
                gratuito_datafinal = DateTime.Now,
                usuario = user
            };

            if (user != null)
            {
                user.assinaturas.Add(ass);
                Database.Session.SaveOrUpdate(user);
            }

Исключение типа 'NHibernate.PropertyValueException'произошло в NHibernate.dll, но не было обработано в пользовательском коде {"Ошибка обезвоживания значения свойства для Test.Models.Assinatura.usuario"} Inner Exc: {"Индекс параметра выходит за пределы диапазона."} Имя свойства: usuario

Я просто хочу установить базовые отношения один-ко-многим между таблицей Усуарио и таблицей Ассинатуры (1 пользователь имеет одну или несколько ассинатур).

1 Ответ

0 голосов
/ 11 сентября 2018

Исключение:

Индекс параметра находится вне диапазона

говорит нам, что мы работаем с одним столбцом БД дважды. И это из-за этого двойного отображения:

    Property(x => x.usuario_id, x => x.NotNullable(true));

    ManyToOne(x => x.usuario, x=>
    {
        x.Cascade(Cascade.DeleteOrphans);
        x.Column("usuario_id");
        ...

Можно использовать один столбец для большего количества свойств (один тип значения, одна ссылка) .. но только для чтения (загрузка значений из БД)

Для вставки / обновления ... мы можем использовать только один из них. И всегда лучше сохранять ссылку на чтение / запись, а свойство только на чтение

    Property(x => x.usuario_id, x => {
        x.NotNullable(true)
        x.Insert(false)
        x.Update(false)
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...