2017-02-28 2 views
1

Compte tenu des tables SQL suivantes:Entity Framework 6 Mapping Courant - un à plusieurs premier code

EntityGroup: 
Id int, (PK) 
GroupName nvarchar(100) 

Entity: 
Id int, (PK) 
EntityGroupId int, (FK Non-nullable) 
Description nvarchar(100) 

et suivants Poços

public class Entity 
    { 
    public int Id { get; set; } 
    public int EntityGroupId { get; set; }  
    public int RefNumber { get; set; } 
    }  

    public class EntityGroup 
    { 
    public int Id { get; set; }  
    public virtual IList<Entity> Entities { get; set; } 
    } 

Comment configurer le mappage couramment correctement? Je veux que Entity.EntityGroupId reste comme un int plutôt qu'un objet EntityGroup.

Je veux pouvoir .Inclure() facultativement Include ("Entités"). Le plus proche je suis arrivé est, mais qui semble avide charge toutes les entités, même si je ne l'utilise .include (« entités »), ce qui est le comportement que je veux:

modelBuilder.Entity<EntityGroup>() 
     .HasMany(x => x.Entities); 
+0

[Chargement paresseux?] (Http://stackoverflow.com/questions/2866881/why-does-the-entity-framework-need-an-icollection-for-lazy-loading) – Jivan

Répondre

2

vous devez déclencher le chargement paresseux, vous pouvez le faire pour seulement une unité spécifique de travail ou pour tous en réglant votre dbContext Comme

dbContext.Configuration.LazyLoadingEnabled = false; 
    dbContext.Configuration.ProxyCreationEnabled = false; 

ou de le définir dans Ctor de votre DbContext.

1

Le problème est lazy loading est activé par défaut, il chargera les entités liées à chaque fois que vous essayez d'obtenir l'accès à them.Two options pour résoudre votre problème pourrait être:

  1. Désactivation chargement paresseux dans votre contexte:

    public YourContext() 
    { 
        this.Configuration.LazyLoadingEnabled = false; 
    } 
    
  2. Retrait virtual de votre propriété de navigation, qui est l'une des les conditions requises pour travailler le chargement paresseux et le changement de suivi:

    public ICollection<Entity> Entities { get; set; } 
    

Si vous voulez en savoir plus sur les moyens pris en charge, vous pouvez charger des entités apparentées dans EF Je vous suggère de lire ce article

1

La façon dont je comprends bien, vous voulez configurer one-to-many relation entre EntityGroup et Entity sans propriété de navigation dans Entity classe et en utilisant Entity.EntityGroupId comme FK. Tout cela avec l'API Fluent.

Il est possible, mais vous devez commencer la configuration de la classe ayant une propriété de navigation (EntityGroup dans votre cas), car Has méthodes nécessitent accesseur de propriété alors que With méthodes ont une surcharge sans paramètre. Comme d'habitude, pour la dernière partie que vous utiliserez la méthode HasForeignKey:

modelBuilder.Entity<EntityGroup>() 
    .HasMany(e => e.Entities) 
    .WithRequired() 
    .HasForeignKey(e => e.EntityGroupId); 

Mais notez que EF reconnaît la convention de dénomination utilisée dans vos classes d'échantillons (en particulier le EntityGroupId), de sorte que vous aurez la même application w/o toute configuration courante ou toute annotation de données.