当使用Entity Framework添加一对多关系数据的时候,通常先添加一的数据,然后再添加多的数据。类似这样:
//添加一的数据var category = new Category{Name="类别1"};category = context.Categories.Add(category);//添加多的数据for(var i = 0; i < 2; i++){ context.Products.Add(new Product{ Name = "产品" + i, CategoryId = category.Id});}context.SaveChanges();
以上,我们对Category和Product分别进行了Add操作,然后统一SaveChanges。是否可以对Category的Products属性赋值,只对Catetegory进行Add,然后SaveChanges呢?
也就是按如下:
var category = new Category{Name="类别1"};for(var i = 0; i < 2; i++){ category.Products.Add(new Product{ Name="产品" + i, Category = category });}context.Categories.Add(category);context.SaveChanges();
那就验证下。
来两个一对多关系的领域模型。
public class Product { public int Id { get; set; } public string Name { get; set; } public int CategoryId { get; set; } public virtual Category Category { get; set; } } public class Category { public int Id { get; set; } public string Name { get; set; } public virtual ICollection<Product> Products { get; set; } public Category() { Products = new List<Product>(); } }
创建上下文:
public class EFTestContext: DbContext { public EFTestContext() : base("conn") { } public DbSet<Category> Categories { get; set; } }
配置连接字符串:
<connectionStrings> <add name="conn" connectionString="Data Source=.;User=YourUsername;Password=YourPassword;Initial Catalog=EFTest;Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings>
客户端程序:
static void Main(string[] args) { using (var context = new EFTestContext()) { var category = new Category { Name = "产品类别3" }; for(var i=0;i<2;i++) { category.Products.Add(new Product { Name = "产品" + i, //Category = category CategoryId = category.Id }); } context.Categories.Add(category); context.SaveChanges(); } Console.WriteLine("运行结束"); Console.ReadKey(); }
运行成功。
总结:当使用Entity Framework添加一对多关系数据的时候,我们通过给一的集合属性赋值,只context.代表一的表s.Add(代表一的实例),也同样可以在数据库中为代表多的那个表添加数据。并且,代表多的那个DbSet不设置也行。