MVC3 DbContext Получить идентификатор новой модели после сохранения? - PullRequest
4 голосов
/ 01 апреля 2012

У меня есть модель Product с отношением 1: n к модели Product_Tag.У меня также есть модель Tag имеет отношение 1: n с Product_Tag.

class Product{
  int ID {get;set;}
  public virtual ICollection<Product_Tag> productTag {get;set;}
}

class Tag {
  int ID {get;set;}
  public virtual ICollection<Product_Tag> productTag {get;set;}

}

class Product_Tag {
  int ID {get;set;}
  int ProductID{get;set;}
  int TagID {get;set;}
  public virtual Product product {get;set;}
  public virtual Tag tag {get;set;}
}

При сохранении нового продукта я хочу иметь возможность сохранять любые ассоциации с тегами в тегах Product_Tags.Для Product_Tag требуется PRoductID и TagID.У меня есть TagID, доступные во время сохранения, но ProductID будет получен из вновь созданного Продукта.Как получить вновь созданный идентификатор продукта сразу после сохранения нового продукта?

В качестве альтернативы, есть ли способ просто сохранить модель продукта с ее тегами productTags, имеющими только TagID, и получить DbContext, чтобы заполнить ProductID для меня?

1 Ответ

8 голосов
/ 01 апреля 2012

Когда вы добавляете новый объект в базу данных, его идентификатор будет автоматически заполняться Entity Framework. Вы можете использовать его.

using (var context = new MyDbContext())
{
    var product = new Product();
    product.Name = "My product";

    context.Products.Add(product);
    context.SubmitChanges();

    var productId = product.ID; // here you can get ID of added product
}

Кроме того, EF может работать с отношениями «многие ко многим», и вам не нужно создавать дополнительный класс для самих отношений. Если вы сначала используете код, вы можете использовать это отображение:

public class Product
{
    int ID {get;set;}
    public virtual ICollection<Tag> Tags {get;set;}
}

public class Tag
{
    int ID {get;set;}
    public virtual ICollection<Product> Products {get;set;}
}

// In your DbContext class:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>().HasMany(x => x.Tags).WithMany(x => x.Products)
        .Map(m =>
        {
            m.ToTable("Product_Tag"); // Relationship table name
            m.MapLeftKey("ProductID"); // Name of column for product IDs
            m.MapRightKey("TagID"); // Name of column for tag IDs
        });
}

Затем вы можете сделать что-то вроде этого:

using (var context = new MyDbContext())
    {
        var product = new Product();
        product.Name = "My product";
        product.Tags.Add(new Tag {Name = "furniture"});
        product.Tags.Add(new Tag {Name = "food"});

        context.Products.Add(product);
        context.SubmitChanges();
    }

В этом случае EF автоматически создает новый продукт, два тега и две взаимосвязи между созданным продуктом и тегами.

...