2010-08-26 8 views
1

J'ai un livre d'objets parent, et une propriété de cet objet est éditeur. Chaque fois que je publie un livre, il ajoute un nouvel éditeur, même si l'éditeur existe déjà. Quelqu'un peut-il me dire comment ajouter le livre et au lieu d'ajouter de nouveau l'éditeur, il suffit de faire référence à un livre existant? Le code que j'utilise est ci-dessous ... Merci d'avance!1 à 1 Relations d'objet dans le code EF4 d'abord

public class Book 
{ 
    public int BookID { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public DateTime CreateDate { get; set; } 

    public virtual Publisher Publisher { get; set; } 
} 

public class Publisher 
{ 
    public int PublisherID { get; set; } 
    public string Address { get; set; } 
} 

public class SqlCEDataStore : DbContext 
{ 
    public DbSet<Book> Books { get; set; } 
    public DbSet<Publishers> Publishers { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.IncludeMetadataInDatabase = false; 
    } 
} 

public class TimeSinkRepository : IRepository<Book> 
{ 
    private static SqlCEDataStore context = new SqlCEDataStore(); 

    public int Add(Book entity) 
    { 
     context.Books.Add(entity); 
     return context.SaveChanges(); 
    } 
} 

var book = new Book() 
{ 
     Title = "New Title", 
     Description = "New Description", 
     CreateDate = DateTime.Now, 
     Publisher = new Publisher() { PublisherID = 1 } 
}; 

var repository = new BookRepository(); 
var result = repository.Add(book); 

Répondre

0

Le problème est dans la ligne:

Publisher = new Publisher() { PublisherID = 1 } 

contexte de l'objet ne sait pas que c'est éditeur existant. Il s'agit d'une entité nouvellement créée afin que le contexte Object effectue une opération d'insertion. Vous devez dire contexte d'objet que l'objet éditeur n'est pas nouvellement créé. Une façon de faire est la modification de votre méthode Add:

public int Add(Book entity) 
{ 
    context.Books.Add(entity); 

    // 0 means new one, other values mean existing one 
    if (entity.Publisher.PublisherID > 0) 
    { 
    context.ObjectStateManager.ChangeObjectState(entity.Publisher, EntityState.Unchanged); 
    } 

    context.SaveChanges(); 
} 
+0

J'ai essayé ceci, mais j'ai obtenu l'erreur suivante: "Le ObjectStateManager ne contient pas un ObjectStateEntry avec une référence à un objet de type" Blah.Publisher "." Des idées? –

0

Il vous pouvez résoudre ce problème en faisant que l'éditeur est jointe au contexte des éditeurs avant d'ajouter l'entité livre (cette façon, il sait que c'est un éditeur de la dbcontext et non pas une nouvelle dont il a besoin pour ajouter (nouveau))

context.Publishers.Attach(book.Publisher); // This is only possible if the Publisher is not new 
context.Books.Add(book); 
0

le problème est dans cette ligne Editeur = new Publisher() {PublisherID = 1}

Vous devriez faire une méthode de récupération afin quelque chose comme ça - Récupère l'éditeur souhaité du contexte (par exemple où id = 1) - Définit l'objet retourné en tant qu'éditeur pour votre nouvel objet livre - Le contexte doit trier le reste pour vous. quand vous enregistrez le livre. (pas besoin de jouer avec le gestionnaire d'état de l'objet)

Bonne chance, si vous ne pouvez pas obtenir ce travail mis en place un peu de code et je vais vous aider si.

Questions connexes