Entity Framework et OnModelCreating()
Je suis en utilisant le code de la première approche, et je suis en train de changer le comportement de la façon dont EF crée mes tables. J'ai deux classes:
Note: j'ai ma base de données supprimé et recréé à chaque fois. Cela ne risque pas d'arriver dans le monde réel, mais pour le test je suis d'essayer d'intercepter la création et de la force EF pour créer la base de la façon dont je l'imagine.
public class Person
{
public int PersonId { get; private set; }
public string Forename { get; set; }
}
public class Officer : Person
{
public int OfficerId { get; private set; }
public bool IsManager { get; set; }
}
Dans mon OnModelCreating() événement, j'ai suivantes:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Person>().HasKey(x => x.PersonId);
modelBuilder.Entity<Person>().ToTable("Person");
modelBuilder.Entity<Officer>().HasKey<int>(x => x.OfficerId);
modelBuilder.Entity<Officer>().ToTable("Officer");
}
Problème est lorsque ma base de données est créée, elle crée les tables:
Table: Personne
PersonId INT PK
Prénom de type nvarchar(50)
Table: Agent De
PersonId INT PK, FK
IsManager PEU
OfficerId INT
Pour moi, c'est anormal qu'elle n'est pas traditionnellement par les conventions de nommage, c'est à dire TableNameId.
Toute aide est très appréciée.
Merci d'avance, Onam.
Merci, j'ai eu un coup d'oeil à ce thread vous l'avez mentionné, s'est avéré très utile.
OriginalL'auteur Dr Schizo | 2013-05-20
Vous devez vous connecter pour publier un commentaire.
Entity Framework ignore cette ligne...
...parce que vous ne pouvez pas définir une clé séparément pour une entité dérivée, seulement pour l'entité de base
Person
lequel vous l'avez fait ici:Cette clé et le nom de la colonne correspondante
PersonId
est ensuite utilisé pour toutes les tables de base et dérivés des entités. Il n'y a aucune manière avec Code-de donner à la colonne de la clé dans les tables dérivées d'un autre nom que dans la table de base.La
OfficerId
dans l'entité dérivéeOfficer
est traité comme un ordinaire propriété scalaire et il apparaît dans le tableauOfficerId INT
sans être unPK
.Concernant la convention de nommage on pourrait dire que l'un
Officer
est unPerson
, donc il peut faire sens pour appeler la cléPersonId
. Eh bien, c'est plus une convention de nommage de l'objet plutôt que de le relationnel et le tableau de point de vue.OriginalL'auteur Slauma
votre structure de classe est un peu incorrect. idéalement, vous devriez faire une classe abstraite dire à personne et puis tirer ou tout simplement supprimer le OfficerId de l'officier de classe. sinon dans l'agent de table, vous aurez personid comme un champ qui est juste redondant domaine et vous ne pourrez pas l'utiliser.
donc ce que vous pouvez faire à la place est
sinon pour le changement de nom de colonne mappée EF champ, vous pouvez utiliser
[Column(Name="COLOUMN NAME")]
attributOriginalL'auteur Parv Sharma