2012-03-31 33 views
4

我有一個與模型Product_Tag具有1:n關係的模型產品。我也有一個模型標籤與Product_Tag具有1:n的關係。MVC3 DbContext保存後獲取新模型ID?

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將來自新創建的產品。如何在保存新產品後立即獲取新創建的產品ID?

另外,是否有一種方法只保存產品模型及其具有唯一TagID的productTags,並獲得DbContext來爲我填充ProductID?

回答

8

當你添加一個新的實體到數據庫時,它的ID將被實體框架自動填充。你可以使用它。

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自動創建一個新的產品,兩個標籤和兩個關係在創建的產品和標籤之間。

+0

不錯!在DbContext中使用新生成的ID很方便。感謝你的回答! – ZuluAlphaCharlie 2012-03-31 22:37:05

+0

讓我們雙倍感謝!關於如何使用EF來解析多對多的第二部分正是我所期待的。 – ZuluAlphaCharlie 2012-03-31 22:50:44