2010-08-26 74 views
1

我有一個父對象簿,該對象的屬性是發佈者。每當我做一本書時,即使發佈者已經存在,它也會添加一個新的發佈者。有人能告訴我如何添加該書,而不是再次添加發布者,只需引用現有的發佈者?我正在使用的代碼如下...在此先感謝!EF4代碼中的1對1對象關係代碼優先

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); 

回答

0

的問題是在該行:

Publisher = new Publisher() { PublisherID = 1 } 

對象上下文不知道,這是現有的出版商。它是新創建的實體,所以對象上下文將執行插入操作。您必須說出發佈者對象不是新創建的對象上下文。要做到這一點的方法之一是您的添加方法的調整:

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

我試過這個,但是得到了下面的錯誤:「ObjectStateManager不包含一個ObjectStateEntry,它引用了一個'Blah.Publisher'類型的對象。」有任何想法嗎? – 2010-09-03 03:56:11

0

它可以通過確保發佈者添加圖書實體之前附着到出版商方面解決這個問題(這樣就知道這是從的DbContext發佈者不,它需要一個新的補充(再次))

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

的問題是在這條線 出版商=新發行(){的publisherId = 1}

你應該做一個獲取方法,以便像這樣的 - 從上下文獲取想要的發佈者(例如,其中id = 1) - 將返回的對象設置爲新圖書對象的發佈者 - 上下文應該爲您挑選剩餘的內容。當你保存這本書。 (不需要與對象狀態管理器混淆)

祝你好運,如果你不能得到這個工作,把它的一些代碼,我會幫助你,雖然它。