De nombreuses de Nombreuses Relations pas l'économie
J'ai deux entités avec une assez standard de Nombreux de Nombreux de la relation que j'ai créé en EF 5 le Premier Code. Ces sont de Service et ServiceItem. L'entité de Service contient une collection de ServiceItems et la ServiceItem contient une collection de Services. Je peux créer, modifier et enregistrer des données à l'une des entités les propriétés de base sans problème. Lorsque j'essaie d'ajouter un ServiceItem d'un Service ou d'un Service à un ServiceItem il semble fonctionner, mais rien n'est sauvegardé. J'ai vérifié que toutes les tables de base de données sont créés, y compris un ServiceItemService table avec la croix-clés. La base de données ServiceItemService tableau ne peut pas faire d'entrée quand j'ai ajouter les éléments. Il n'y a pas d'erreur et tout le reste semble fonctionner parfaitement.
Je suis un peu perplexe et pourrait utiliser un peu d'aide. Ci-dessous sont les classes.
La classe de Service;
public class Service
{
//Default constructor
public Service()
{
//Defaults
IsActive = true;
ServicePeriod = ServicePeriodType.Monthly;
ServicePeriodDays = 0;
ServiceItems = new Collection<ServiceItem>();
}
public int ServiceID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public ICollection<ServiceItem> ServiceItems { get; set; }
public string TermsOfService { get; set; }
public ServicePeriodType ServicePeriod { get; set; }
public int ServicePeriodDays { get; set; }
public bool IsActive { get; set; }
}
La ServiceItem classe;
public class ServiceItem
{
public ServiceItem()
{
IsActive = true;
}
public int ServiceItemID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public ICollection<Service> Services { get; set; }
public string UserRole { get; set; }
public bool IsActive { get; set; }
}
C'est la fluidité de la cartographie je l'ai fait tout en essayant de corriger de cette question. Le même problème s'est passé avant et après l'ajout de cette cartographie.
public DbSet<Service> Services { get; set; }
public DbSet<ServiceItem> ServiceItems { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Service>()
.HasMany(p => p.ServiceItems)
.WithMany(r => r.Services)
.Map(mc =>
{
mc.MapLeftKey("ServiceItemID");
mc.MapRightKey("ServiceID");
mc.ToTable("ServiceItemService");
});
}
Voici le code que j'utilise pour enregistrer l'élément de Service qui comprend 2 ou 3 ServiceItems dans le Service.ServiceItems collection. J'ai bien vérifié que le ServiceItems étaient dans la bonne collection.
db.Entry(dbService).State = EntityState.Modified;
db.SaveChanges();
La dbService objet ne semble pas être affecté d'une quelconque manière. Le ServiceItems sont toujours dans la bonne collection, mais pas de mise à jour sont apportées à la ServiceItemService table de base de données. Tout conseil serait le bienvenu.
-Grâce
Vous devez vous connecter pour publier un commentaire.
Il est prévu que rien ne se passe.
Ce que vous voulez modifier ou ajouter une relation entre les entités
Service
etServiceItem
. Mais vous ne pouvez pas manipuler les relations en définissant l'état d'une entité àModified
. Ce jour uniquement scalaire complexe et les propriétés, mais pas les propriétés de navigation (= relations). (Par exemple en définissant l'état d'unService
entitéModified
marqueraService.Title
etService.Description
, etc. tel que modifié et s'assurer que ces propriétés sont enregistrées dans la base de données. Mais il ne s'occupe pas du contenu deService.ServiceItems
.)La seule exception, où vous pouvez modifier un relation en définissant l'état de
Modified
sont les Associations de Clé Étrangère. Ce sont des associations qui ont des propriétés de clé étrangères exposée dans votre modèle entité, et ils ne peuvent se produire pour un-à-plusieurs ou un-à-un les associations. Plusieurs-à-plusieurs liens sont toujours Associations Indépendantes ce qui signifie qu'ils ne peuvent jamais avoir une propriété de clé étrangère dans une entité. (Parce que le FKs sont dans la table de jointure, mais la table de jointure n'est pas une entité et "caché" à partir de votre modèle de classes.)Il existe un moyen de manipuler directement les relations plusieurs-à-plusieurs association, mais il nécessite d'aller jusqu'à la
ObjectContext
et sesRelationshipManager
qui est - à mon avis - assez avancés et délicate.L'habitude et directe manière d'ajouter et de supprimer la relation entrées/à partir de plusieurs-à-plusieurs association est en leur ajoutant des éléments à et la suppression d'éléments de collections tandis que les entités sont attachées au contexte. EF changement de mécanisme de suivi permettra de reconnaître les changements que vous avez fait et de générer de l'appropriées INSERT, UPDATE et DELETE lorsque vous appelez
SaveChanges
.La procédure exacte dépend si vous aussi vous souhaitez enregistrer
Service
et/ouServiceItem
que de nouvelles entités ou si vous voulez seulement ajouter des relations entre les entités existantes. Voici quelques exemples:service
doit être Inséré, tous lesserviceItem
s doit être Insérée et les relations entre les entités doivent être Insérées dans la table de jointure ainsi:L'ajout de la "racine" de
service
de l'objet graphique est assez parce que EF reconnaître que toutes les autres entités dans le graphique ne sont pas attachées au contexte et à supposer qu'ils doivent être Insérés dans la base de données.service
existe déjà et ne doit PAS être Inséré, tous lesserviceItem
s doit être Insérée et les relations entre les entités doivent être Insérées dans la table de jointure ainsi:EF reconnaît ici (quand
SaveChanges
s'appelle) quiservice
est attaché, mais les autres entités ne sont pas. Pas de notice pourservice
qui se passe mais lesserviceItem1/2
sera Inséré avec la relation des entrées.service
existe déjà et ne doit PAS être Inséré, tous lesserviceItem
s existent déjà et ne doit PAS être Inséré, mais les relations entre les entités doivent être Insérées dans la table de jointure:Complet: Comment supprimer les relations entre les entités existantes?
Les deux relations de lignes dans la table de jointure que le service de liaison 15 avec serviceItem 23 et 37 sera supprimé.
Alternativly au lieu de l'appeler
Attach
vous pouvez charger les entités existantes de la base de données. Il fonctionnera aussi bien:Et la même pour les
ServiceItem
s.