NHibernate - 脱水 属性 值时出错 - 更新实体
NHibernate - Error dehydrating property value - updating entity
我在保存具有关联的实体时遇到问题。下面是我的代码,它给出了错误
Fluent Class 继承自 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");
}
Table"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());
}
Table"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);
}
An exception of type 'NHibernate.PropertyValueException' occurred in NHibernate.dll but was not handled in user code
{"Error dehydrating property value for Test.Models.Assinatura.usuario"}
Inner Exc: {"Parameter index is out of range."}
Property Name: usuario
我只想在 Usuario table 和 Assinature table 之间建立一个基本的一对多关系(1 个用户有一个或多个 assinaturas)。
异常:
Parameter index is out of range
告诉我们,我们正在对一个数据库列进行两次处理。那是因为这个双重映射:
Property(x => x.usuario_id, x => x.NotNullable(true));
ManyToOne(x => x.usuario, x=>
{
x.Cascade(Cascade.DeleteOrphans);
x.Column("usuario_id");
...
可以将一列用于更多属性(一种值类型,一种引用)..但仅用于读取(从数据库加载值)
对于插入/更新...我们只能使用其中之一。并且总是最好保留 read/write 参考,并且 属性 只读
Property(x => x.usuario_id, x => {
x.NotNullable(true)
x.Insert(false)
x.Update(false)
})
我在保存具有关联的实体时遇到问题。下面是我的代码,它给出了错误
Fluent Class 继承自 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");
}
Table"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());
}
Table"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);
}
An exception of type 'NHibernate.PropertyValueException' occurred in NHibernate.dll but was not handled in user code {"Error dehydrating property value for Test.Models.Assinatura.usuario"} Inner Exc: {"Parameter index is out of range."} Property Name: usuario
我只想在 Usuario table 和 Assinature table 之间建立一个基本的一对多关系(1 个用户有一个或多个 assinaturas)。
异常:
Parameter index is out of range
告诉我们,我们正在对一个数据库列进行两次处理。那是因为这个双重映射:
Property(x => x.usuario_id, x => x.NotNullable(true));
ManyToOne(x => x.usuario, x=>
{
x.Cascade(Cascade.DeleteOrphans);
x.Column("usuario_id");
...
可以将一列用于更多属性(一种值类型,一种引用)..但仅用于读取(从数据库加载值)
对于插入/更新...我们只能使用其中之一。并且总是最好保留 read/write 参考,并且 属性 只读
Property(x => x.usuario_id, x => {
x.NotNullable(true)
x.Insert(false)
x.Update(false)
})