2013-01-11 4 views
0

Est-il possible d'avoir un mappage de clé étrangère basé sur une valeur de colonne spécifique.Entity Framework - Code Premier problème de mappage

J'ai les entités suivantes.

public class Controller 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public virtual List<ControllerDevice> ActiveDevices { get; set; } 
    public virtual List<ControllerDevice> TamperedDevices { get; set; } 
    public virtual List<ControllerDevice> IgnoredDevices { get; set; } 
} 

public class ControllerDevice 
{ 
    public int Id { get; set; } 
    public DeviceStatus Status { get; set; } 

    public int ControllerId { get; set; } 
    public int NetworkDeviceId { get; set; } 

    public virtual Controller Controller { get; set; } 
    public virtual NetowkDevice NetowkDevice { get; set; } 
} 

public class NetowkDevice 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public enum DeviceStatus 
{ 
    Active, 
    Tampered, 
    Ignored 
} 

Est-il possible d'avoir le ActiveDevices, TamperedDevices et IngoredDevices liste soit automatiquement configurée en fonction de ControllerDeviceDeviceStatus, ou devrais-je créer trois tables différentes pour chaque liste. IE ActiveControllerDevice, TamperedControllerDevices et IgnoredControllerDevices.

S'il vous plaît laissez-moi savoir si vous avez besoin d'explications supplémentaires.

Répondre

0

Utilisation collection d'appareils unique:

public class Controller 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public virtual List<ControllerDevice> Devices { get; set; } 
} 

... et filtrer, lorsque vous avez besoin de traiter ou de dispositifs d'affichage avec spécifique valeur Status:

controller.Devices.Where(d => d.Status == DeviceStatus.Active); 

Plusieurs tables pour chaque état des appareils, et/ou la hiérarchie des périphériques (théoriquement, vous pouvez résoudre ce problème avec un héritage TPH) est un moyen de l'enfer, car au lieu de l'entité unique ControllerDevice avec un statut, vous obtiendrez trois types d'entité (ActiveControllerDevice, TamperedControllerDevice et IgnoredControllerDevice), ce qui ne correspond pas au modèle. Au lieu de changer de statut, l'appareil va changer type, et vous ne pouvez pas le faire de manière simple.

+0

Salut Dennis, je pense que je tentais de trop compliquer les choses , cela ressemble à une bien meilleure solution. Merci. – Jethro

0

Oui, vous pouvez le faire. La prise en charge d'Enum a été introduite dans Entity Framework 5, .Net Framework 4.5. Dans Entity Framework, une énumération peut avoir les types sous-jacents suivants: Byte, Int16, Int32, Int64 ou SByte.

Et vous pouvez filtrer comme ceci:

context.ControllerDevices.Where(d => d.Status == DeviceStatus.Active); 

Plus ici: http://msdn.microsoft.com/en-us/data/hh859576.aspx

+0

OP demandant sur la capacité de filtrer les données lors de * mappage *, pas * interrogation *. – Dennis

+0

Dennis a raison. – Jethro

0
public class TestContext : DbContext 
{ 
    public TestContext() 
    { 
     Configuration.AutoDetectChangesEnabled = true; 
     Configuration.LazyLoadingEnabled = true; 
     Configuration.ProxyCreationEnabled = true; 
     Configuration.ValidateOnSaveEnabled = true; 
    } 

    public virtual DbSet<NetowkDevice> NetowkDevices{ get; set; } 
    public virtual DbSet<ControllerDevice> ControllerDevices{ get; set; } 
    public virtual DbSet<Controller> Controlleres{ get; set; } 
} 

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d0443029-2175-4bde-a834-4f8dbf313201/

Should I enable or disable dynamic proxies with entity framework 4.1 and MVC3?

+0

Comment ceci répond à la question originale? – Dennis

Questions connexes