Отношения объектов 1 к 1 в коде EF4 - PullRequest
1 голос
/ 26 августа 2010

У меня есть родительская объектная книга, и свойство этого объекта - издатель. Каждый раз, когда я рекламирую книгу, она добавляет нового издателя, даже если издатель уже существует. Может кто-нибудь сказать мне, как добавить книгу и вместо добавления издателя, просто сослаться на существующий? Код, который я использую ниже ... Спасибо заранее!

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

Ответы [ 3 ]

0 голосов
/ 12 января 2011

Это можно решить, убедившись, что Publisher подключен к контексту Publishers, прежде чем добавлять сущность Book (таким образом, он знает, что это Publisher из dbcontext, а не новый, который нужно добавить (снова)) *

context.Publishers.Attach(book.Publisher); // This is only possible if the Publisher is not new
context.Books.Add(book);
0 голосов
/ 23 января 2013

проблема в этой строке Publisher = new Publisher () {PublisherID = 1}

Вы должны сделать метод извлечения, чтобы что-то вроде этого - Получить нужный издатель из контекста (например, где id = 1) - Установите возвращаемый объект в качестве издателя для вашего нового объекта книги - Контекст должен решить все остальное за вас. когда вы сохраните книгу. (не нужно связываться с менеджером состояния объекта)

Удачи, если вы не можете заставить эту работу поднять какой-то код, и я помогу вам, хотя это.

0 голосов
/ 27 августа 2010

Проблема в строке:

Publisher = new Publisher() { PublisherID = 1 }

Контекст объекта не знает, что это существующий издатель. Это вновь созданная сущность, поэтому контекст объекта будет выполнять операцию вставки. Вы должны сказать контексту объекта, что объект издателя не создан заново. Один из способов сделать это - модификация вашего метода 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...