EF代码优先使用流畅的API时,种子多对多关系不起作用

时间:2015-07-09 14:35:36

标签: entity-framework ef-code-first ef-fluent-api

当我添加Fluent API时,我遇到了将多对多种表播种的问题。

首先,我创建了两个实体,它们之间的多对多关系如下:

    [Table("meta.DataCategory")]
public partial class DataCategory : ResolvableEntityBase
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Column("DataCategoryId")]
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    [Column("DataCategory")]
    [DisplayName("DataCategory")] 
    public string Name { get; set; }

    public virtual ICollection<DestinationTable> DestinationTables { get; set; }  
}

[Table("meta.DestinationTable")]
public partial class DestinationTable
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Column("DestinationTableId")]
    public int Id { get; set; }

    [Required]
    [StringLength(200)]
    [Column("TableName")]
    public string Name { get; set; }

    [Required]
    [StringLength(200)]
    [Column("SchemaName")]
    public string Schema { get; set; }

    public virtual ICollection<DataCategory> DataCategories { get; set; }
}

添加迁移并更新数据库会创建3个表,包括DataCategory和DestinationTable之间的多对多表。此处显示的种子代码也可以正常工作,我能够将测试数据填充到所有3个表中:

    context.DataCategories.AddOrUpdate(s => s.Id,
        new DAL.DataCategory() { Id = 0, Name = "Unknown", RegexPattern = @"" },
        new DAL.DataCategory() { Id = 1, Name = "ProductsMaster", RegexPattern = @"(?:\b|[_]{1})(product|products|produkter|articles)(?:\b|[_]{1})" },
        new DAL.DataCategory() { Id = 2, Name = "CustomersTraffic", RegexPattern = @"(?:\b|[_]{1})(trafik|antal)(?:\b|[_]{1})" },
        new DAL.DataCategory() { Id = 3, Name = "ProductSales", RegexPattern = @"(?:\b|[_]{1})(salg|sales|ugedata|uge data|uge_data)(?:\b|[_]{1})" },
        new DAL.DataCategory() { Id = 4, Name = "CategorySales", RegexPattern = @"(?:\b|[_]{1})(kategory|kategori|category|kat)(?:\b|[_]{1})" },
        new DAL.DataCategory() { Id = 5, Name = "StoresMaster", RegexPattern = @"(?:\b|[_]{1})(site\bmaster|store|stores|butik)(?:\b|[_]{1})" },
        new DAL.DataCategory() { Id = 6, Name = "MultipleCategories", RegexPattern = @"" },
        new DAL.DataCategory() { Id = 7, Name = "ConsultantsMaster", RegexPattern = @"" }
        );


DAL.DestinationTable dt = new DAL.DestinationTable();            
dt.Id = 1;
dt.Name = "Product";
dt.Schema = "DW"; 
dt.Type = "Reference";
dt.DataCategories = new List<DAL.DataCategory>();
dt.DataCategories.Add (context.DataCategories.Where(x => x.Name == "ProductsMaster").First());
context.DestinationTables.AddOrUpdate(x => x.Name, dt);

dt = new DAL.DestinationTable();            
dt.Id = 2;
dt.Name = "Store";
dt.Schema = "DW"; 
dt.Type = "Reference";
dt.DataCategories = new List<DAL.DataCategory>();
dt.DataCategories.Add (context.DataCategories.Where(x => x.Name == "StoresMaster").First());
context.DestinationTables.AddOrUpdate(x => x.Name, dt);

dt = new DAL.DestinationTable();            
dt.Id = 3;
dt.Name = "ProductSales";
dt.Schema = "DW"; 
dt.Type = "Transactions";
dt.DataCategories = new List<DAL.DataCategory>();
dt.DataCategories.Add (context.DataCategories.Where(x => x.Name == "ProductSales").First());
dt.DataCategories.Add (context.DataCategories.Where(x => x.Name == "ProductsMaster").First());
dt.DataCategories.Add (context.DataCategories.Where(x => x.Name == "StoresMaster").First());
context.DestinationTables.AddOrUpdate(x => x.Name, dt);

到目前为止很好,但是,在dbo架构下创建了多对多的表,并且列名使用了_Id后缀,我没有在模型的其余部分使用,所以我不得不改变它,所以我在OnModelCreating()方法中使用了以下Fluent API:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<DAL.DestinationTable>()
               .HasMany<DAL.DataCategory>(dest => dest.DataCategories)
               .WithMany(dcat => dcat.DestinationTables)
               .Map(m2m =>
               {
                   m2m.MapLeftKey("DestinationTableId");
                   m2m.MapRightKey("DataCategoryId");
                   m2m.ToTable("DestinationTableToDataCategory", "meta");
               });
    }

这在命名表格方面取得了预期的结果,并按照我希望的方式命名列,但现在播种不像以前那样。

种子代码填充DataCatetory记录和DestinationTable记录,但多对多表是空的。我试图尊重方向,因此DataCategory位于左侧,但结果是相同的,即没有填充多对多的表。

请注意,种子方法完全没有错误地运行。

为什么会这样? 在使用Fluent API绕过EF默认值时,有多种关系可以实现多种关系?

Fluent API部分是否存在错误/缺失?

1 个答案:

答案 0 :(得分:0)

行,

我将整个数据库回滚到初始状态,然后我再次应用了所有迁移,结果是现在种子正在运行,并且数据填充在所有3个表中。

不能说出了什么问题。