2016-10-07 1 views
1

J'ai un problème, je dois créer un modèle où nous avons deux entités qui peuvent être reliées entre elles, mais peut également exister en tant qu'entités autonomes.Entity Framework - connexion Définir où aucune des deux parties est nécessaire

Le modèle ressemble actuellement à ceci:

public class Authorisation 
{ 
    public int AuthorisationID { get; set; } 

    public virtual Change Change { get; set; } 
} 


public class Change 
{ 
    public int ChangeID{ get; set; } 

    public virtual Authorisation Authorisation { get; set; } 

    public int? AuthorisationID{ get; set; } 
} 

La raison est que nous pouvons avoir un organisme indépendant d'enregistrement d'autorisation d'un changement, et certains changements nécessitent une autorisation et certains ne faites pas, si aucune des deux parties de la relation est requis.

Je peux le configurer avec l'API couramment comme ceci:

modelBuilder.Entity<Authorisation>() 
     .HasOptional(t => t.Change) 
     .WithOptionalPrincipal(t => t.Authorisation); 

Et bien Alls, Sauf que la migration qu'il crée se présente comme suit

CreateTable(
      "dbo.Changes", 
      c => new 
       { 
        ChangeID = c.Int(nullable: false, identity: true), 
        AuthorisationID = c.Int(), 
        Authorisation_AuthorisationID = c.Int(), 
       }) 
      .PrimaryKey(t => t.ChangeID) 
      .ForeignKey("dbo.Authorisations", t => t.Authorisation_AuthorisationID) 
      .Index(t => t.Authorisation_AuthorisationID); 

EF décide que sa va ajouter une nouvelle colonne (Authorisation_AuthorisationID) pour moi d'utiliser comme FK entre les deux entités, ce que je veux vraiment être en mesure de le faire est d'utiliser la propriété change.AuthorisationID comme FK sur l'autorisation, je ne peux pas trouver un façon de configurer cela du tout (S'il vous plaît noter que j'ai besoin de la FK pour être dans le modèle - pour la cohérence avec le reste de l'application plus que toute autre chose).

Pour résumer, je dois être en mesure de créer une relation entre deux entités où les deux parties de la relation sont facultatives et, si possible, je veux être en mesure de définir la colonne FK moi-même.

Suis-je simplement aborder ce problème? J'ai regardé le même bloc de code pendant si longtemps que je pourrais manquer quelque chose de simple.

+0

To clarifier, après un peu de creuser à travers le code et en regardant ce que l'application est ac mettre dans la base de données le problème que j'ai en fait plus que je dois spécifier le FK moi-même, ou au moins être en mesure d'obtenir la clé générée automatiquement à partir d'une instance de l'entité – 5NRF

Répondre

0

Ressemble propriété explicite clé étrangère ne sont pas pris en charge pour one-to-one relations - il n'y a pas HasForeignKey API Fluent et aussi si vous mettez ForeignKey attribut sur la propriété de navigation vous obtenez exception en disant que la multiplicité doit être *.

Ainsi, le seul choix que vous avez est de supprimer l'explicite Change.AuthorisationID propriété et travailler uniquement avec des propriétés de navigation:

Modèle:

public class Authorisation 
{ 
    public int AuthorisationID { get; set; } 
    public virtual Change Change { get; set; } 
} 

public class Change 
{ 
    public int ChangeID{ get; set; } 
    public virtual Authorisation Authorisation { get; set; } 
} 

Configuration:

modelBuilder.Entity<Authorisation>() 
    .HasOptional(t => t.Change) 
    .WithOptionalPrincipal(t => t.Authorisation) 
    .Map(a => a.MapKey("AuthorisationID")); 
+0

Voilà ce que je pensais. Un peu pénible, j'aurais pu faire avec la possibilité de régler le FK sur l'objet de changement plutôt que d'avoir à récupérer l'autorisation, mais je suppose que si c'est la seule option ... Merci! – 5NRF