La cartographie de clé étrangère dans HasOptional().WithOptionalDependent() relation dans l'Entity Framework 6
J'ai les données suivantes-modèle Entity Framework 6.1.3:
using System.Data.Entity;
public class Student
{
public int Id { get; set; }
public virtual Contact Contact { get; set; }
}
public class Contact
{
public int Id { get; set; }
public virtual Student Student { get; set; }
}
public class MyContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder builder)
{
builder.Entity<Contact>()
.HasOptional(x => x.Student)
.WithOptionalDependent(x => x.Contact)
.WillCascadeOnDelete(true);
}
}
public static class Program
{
private static void Main()
{
Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>());
using (var context = new MyContext())
context.Database.Initialize(force: true);
}
}
Lorsque je lance ce code, j'obtiens exactement la structure de la table, je poursuis:
dbo.Contacts
Id (PK)
Student_Id (FK, NULL, CASCADE ON DELETE)
dbo.Students
Id (PK)
Cependant, maintenant, je voudrais ajouter la Student_Id
propriété disponible dans le Contact
entité. Donc, je peux lire le Student_Id
sans avoir à se joindre à l'autre de la table à travers .Student.Id
de navigation.
Si je l'ajout de la propriété de la Contact
entité, je me retrouve soit avec deux colonnes Student_Id
et Student_Id1
, ou je me retrouve avec un message d'erreur disant Each property name in a type must be unique.
.
La colonne est déjà dans la base de données, j'ai besoin de l'avoir dans l'entité ainsi, pourquoi est-il tant de mal? Est-il une solution?
J'ai essayé de faire ceci, cependant, comme je l'ai dit dans la question, l'EF ne me laisse pas faire. Il crée deux colonnes ou il se plaint de l'unicité des noms de propriété. J'ai essayé d'expérimenter avec l'ajout du champ de modèle, j'ai même essayé de la configuration de la relation avec le MapKey fonction, sans succès.
À droite, vous devez dire à EF comment faire de l'association avec HasForeignKey ou MapKey. patrickdesjardins.com/blog/...
Merci pour l'aide. Le problème avec HasForeignKey est qu'il est uniquement disponible en
WithMany
relations. Et lorsque j'essaie d'utiliser MapKey, je me retrouve soit avec deux colonnes ou avec l'erreur que j'ai mentionnés.
OriginalL'auteur Tom Pažourek | 2015-08-31
Vous devez vous connecter pour publier un commentaire.
J'ai réussi à obtenir une réponse de l'Entité Cadre Gestionnaire de Programme après poser sur GitHub.
– Rowan Miller @
https://github.com/aspnet/EntityFramework6/issues/159#issuecomment-274889438
OriginalL'auteur Tom Pažourek
Si vous voulez déclarer la FK à la propriété dans la dépendante de l'entité, dans un un pour une relation, je crains que vous devez l'utiliser comme un PK trop. EF Premier Code nécessite que PK de la personne à charge de l'entité doit être FK de la relation:
Mais je pense que ce n'est pas ce que vous cherchez. Donc, je pense que vous avez trois possibilités:
Par mon expérience, la dernière est la plus ajusté à ce qui sont que vous essayez d'atteindre (mais c'est mon avis). Dans ce cas, vous pouvez travailler avec le Fk de la propriété que vous voulez, la seule solution est qu'il faut changer le
Contact
propriété de navigation surStudent
par une collection (ou omettre cette valeur liquidative. de la propriété et de créer une relation unidirectionnelle):La configuration serait de cette façon:
Mise à jour
Une quatrième option pourrait être de créer deux unidirectionnel relations:
Mais cette option rompt la relation réelle entre les deux tables.
Si vous souhaitez créer un un pour une relation et chacune des entités a son propre PK, j'ai peur que la seule option est que vous avez déjà. Désolé, il n'y a pas de correspondance entre le FK colonne avec cette configuration
Je vous remercie pour votre aide. Est-il une raison pour que? Je veux dire, la colonne est déjà là, j'ai juste envie de la lire. Il serait bizarre si une telle limitation de l'Entity Framework serait déraisonnable.
Je ne sais pas vraiment comment EF gère en interne, le vrai, est-ce que vous essayez de réaliser n'est pas une vraie, d'une relation, dans un un à un rel. les deux entités doivent partager le même PK. Peut-être vous pouvez trouver plus d'informations sur ce sujet dans ce lien
Cette relation est 0..1 0..1, ce qui signifie qu'il n'est pas même possible de partager le PK.
OriginalL'auteur octavioccl