2011-02-16 3 views
2

J'utilise le code premier CTP 5. J'ai une configuration assez simple entre une table parent et tables enfantpremier code et références parent-enfant

Create table testA (
    id int not null identity(1,1), 
    stuff varchar(200), 
    primary key (id) 
    ); 
go 

create table testB (
    id int not null 
     foreign key references testA(id), 
    morestuff varchar(200), 
    primary key (id) 
    ); 
go 

Pour se référer à ce tableau en utilisant le code d'abord, nous avons la construction suivante:

namespace Test.Models 
{ 
    public class TestEntities : DbContext 
    { 
     public DbSet<testa> testa { get; set; } 
     public DbSet<testb> testb { get; set; } 

     protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 

      modelBuilder.Entity<testa>().ToTable("testa"); 
      modelBuilder.Entity<testa>() 
       .Property(p => p.id) 
       .HasDatabaseGenerationOption(DatabaseGenerationOption.Identity); 

      modelBuilder.Entity<testb>().ToTable("testb"); 
     } 
    } 


    public class testa 
    { 
     public int id { get; set; } 
     public String stuff { get; set; } 

     public virtual testb testb { get; set; } 
    } 

    public class testb 
    { 
     public int id { get; set; } 
     public string morestuff { get; set; } 

     public virtual testa testa { get; set; } 
    } 
} 

lorsque je tente d'ajouter un enregistrement à testa, je reçois l'erreur « Impossible d'insérer la valeur explicite pour la colonne d'identité dans le tableau « testa » lorsque IDENTITY_INSERT est réglé sur OFF. »

Ok. Strike 1 to Code First pour ne pas reconnaître que Id est une colonne d'identité. Nous pouvons résoudre ce problème, donc nous dire que CodeFirst testa.id est une identité:

modelBuilder.Entity<testa>() 
     .Property(p => p.id) 
     .HasDatabaseGenerationOption(DatabaseGenerationOption.Identity); 

Cela fait, nous courons encore et d'obtenir une autre erreur: « Une propriété dépendante dans un ReferentialConstraint est mis en correspondance avec une colonne générée en magasin Colonne: 'id' ". Alors - quel est le problème avec cette image? Qu'est-ce que je fais mal et comment puis-je le réparer ???

Répondre

3

Dans une association 1: 1, le code identifie d'abord l'une des entités comme principale et l'autre comme dépendante. Ensuite, il rend le PK principal en tant qu'identité et vous devez prendre en charge un PK unique valide lors de l'insertion dans la table dépendante. Dans votre cas, il choisit testb en tant que principal, mais il semble que vous voulez testa être l'extrémité principale de cette association. Cela pourrait être réalisé en utilisant l'API fluide et donnant essentiellement allusion à premier code dont l'un est principal et dont on dépend:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<testb>() 
       .HasRequired(b => b.testa) 
       .WithOptional(a => a.testb);     
} 

Pour plus d'informations, jetez un oeil à cet article:
Associations in EF Code First CTP5: Part 2 – Shared Primary Key Associations