2012-03-31 79 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