NHibernate: Quelle est l'identité Id mis à jour lors de l'enregistrement d'une instance éphémère?
Si j'utilise la session-par-opération et appeler:
session.SaveOrUpdate(entité) corrigé:
session.SaveOrUpdateCopy(entité)
..et l'entité est une instance transitoire de l'identité-Id=0. Est au-dessus de la ligne automatiquement à jour l'Id de l'entité, et de faire l'instance persistante? Ou devrait-il le faire sur la transaction.S'engager? Ou dois-je en quelque sorte de code de façon explicite?
Évidemment l'Id de la ligne de base de données (nouvelles, depuis transitoire) est automatiquement générée et enregistrée comme un certain nombre, mais je parle du paramètre réel exemple ici. Qui est la logique métier de l'instance.
MODIFIER - Suivi, de problèmes liés à la.
Mappages:
public class StoreMap : ClassMap<Store>
{
public StoreMap()
{
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name);
HasMany(x => x.Staff) //1:m
.Cascade.All();
HasManyToMany(x => x.Products) //m:m
.Cascade.All()
.Table("StoreProduct");
}
}
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.FirstName);
Map(x => x.LastName);
References(x => x.Store); //m:1
}
}
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name).Length(20);
Map(x => x.Price).CustomSqlType("decimal").Precision(9).Scale(2);
HasManyToMany(x => x.StoresStockedIn)
.Cascade.All()
.Inverse()
.Table("StoreProduct");
}
}
EDIT2
Définitions de classe:
public class Store
{
public int Id { get; private set; }
public string Name { get; set; }
public IList<Product> Products { get; set; }
public IList<Employee> Staff { get; set; }
public Store()
{
Products = new List<Product>();
Staff = new List<Employee>();
}
//AddProduct & AddEmployee is required. "NH needs you to set both sides before
//it will save correctly"
public void AddProduct(Product product)
{
product.StoresStockedIn.Add(this);
Products.Add(product);
}
public void AddEmployee(Employee employee)
{
employee.Store = this;
Staff.Add(employee);
}
}
public class Employee
{
public int Id { get; private set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Store Store { get; set; }
}
public class Product
{
public int Id { get; private set; }
public string Name { get; set; }
public decimal Price { get; set; }
public IList<Store> StoresStockedIn { get; private set; }
}
OriginalL'auteur bretddog | 2011-02-04
Vous devez vous connecter pour publier un commentaire.
En ce qui concerne votre question, à chaque fois que vous videz votre session, c'est quand votre entité est conservée dans la base de données. Lors de l'enregistrement de votre (nouveau) de l'entité, NHibernate génère l'ID pour vous en utilisant le générateur que vous avez fournis.
Garder à l'esprit qu'une Identité de groupe électrogène n'est pas recommandée (voir ce post par Ayende).
Lorsque vous utilisez un générateur d'identifiant, votre nouvelle entité est conservée dans la base de données lors de la sauvegarde, même si vous ne les jetez pas à la base de données. La raison à cela est parce que NHibernate besoins afin de vous fournir un IDENTIFIANT de l'entité, il ne peut pas le faire sans faire un aller-retour à la base de données.
Une meilleure solution serait d'utiliser quelque chose comme un générateur de Guid, ou HiLo si vous voulez "normal" des valeurs. De cette façon, vous pouvez enregistrer votre entité sans avoir à faire un aller-retour de la base de données, qui permet de faire beaucoup plus de performance sage (dosage vient à l'esprit).
Je vais devoir vérifier qu'avec le profiler, mais il pourrait très bien l'être.
OriginalL'auteur Erik van Brakel
Je ne suis pas sûr de comprendre ta question. Les économies réelles à la base de données se produit lorsque la session est vidé (par exemple, par la validation de la transaction). L'appel de SaveOrUpdate() n'a pas lui-même économiser de l'entité, c'est juste informe de la séance à laquelle l'entité est due à être enregistrés lors de la session a été vidé.
En supposant que l'ID de l'entité correspond à un champ d'identité dans la base de données et que votre cartographie dit NHibernate que l'identité est définie par la base de données, puis l'ID défini par la base de données sera défini comme l'entité ID lorsqu'il est enregistré.
Si votre id est 0 après validation, vous n'avez pas de carte du générateur correctement.
Merci! qui était bon pour obtenir fermement confirmé. Ensuite, il doit être lié à mon autre problème stackoverflow.com/questions/4890123/.... Je pensais que cette Id-problème pourrait être la cause de celle-là. Mais alors, je suppose que c'est un effet, pas une cause. Btw; Par "générateur", entendez-vous la norme de l'entité de la classe mappages? ou la ISessionFactory de configuration?
Changer d'Id(x => x.Id); Id(x => x.Id).GeneratedBy.Identity();
Je l'ai fait (la pensée, il a été générée automatiquement par défaut, mais pas sûr). Mais il n'est toujours pas de mise à jour de l'entité-Id.
OriginalL'auteur David
Nhibernate va définir la propriété ID de votre entité, juste après SaveOrUpdate appel.
Vous êtes à la cartographie avec XML ?
FluentNHibernate à en juger par les OP des balises.
Généralement Id pas est lorsque le Nom de l'attribut de l'id de la propriété dans les mappages n'est pas définie. Mais Couramment le fait par défaut je pense
Oui j'ai une carte avec fluent: Id(x => x.Id).GeneratedBy.Identity(); Essayé aussi Id(x => x.Id).Colonne("Id").GeneratedBy.Identity ();, mais n'a pas aidé.
OriginalL'auteur Sly
J'ai remarqué que j'ai sauvé en appelant le:
..qui ne met PAS à jour l'Id. Mais en changeant de:
..l'Identifiant d'une entité sera être mis à jour.
J'ai probablement mal compris le documentation (?).. Section 9.4.2 dit:
SaveOrUpdateCopy(Object o)... Si l'instance donnée est non enregistrées ou n'existe pas dans la base de données, NHibernate le sauver et de le renvoyer une nouvelle instance persistante.
Est-ce juste moi, ou n'est-il pas sonner comme un transitoire de l'objet (non enregistrées), sera "retourné comme persistante" ? Ne pas dire avec Id mis à jour? Aimerais avoir une clarification comment interpréter cette phrase correctement (?)
SaveOrUpdateCopy
, sauf si vous comprenez ce qu'il fait, et qu'il est applicable à votre situation; toujours utiliserSaveOrUpdate
par défaut.SaveOrUpdate
permettra de sauvegarder ou de mettre à jour votre instance d'entité, et de mettre à jour l'id de la propriété si elle est transitoire.SaveOrUpdateCopy
sera de retour d'une nouveau > objet avec l'id changé; quel que soit l'objet que vous avez appelé la méthode ne sera pas modifié.OriginalL'auteur bretddog