首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用fluent API时,EF代码初始种子多对多关系不起作用

当使用fluent API时,EF代码初始种子多对多关系不起作用
EN

Stack Overflow用户
提问于 2015-07-09 22:35:36
回答 1查看 301关注 0票数 0

当我添加Fluent API时,我遇到了一个多对多表的种子问题。

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

代码语言:javascript
复制
    [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个表中:

代码语言:javascript
复制
    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:

代码语言:javascript
复制
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在左侧,但结果是相同的,即多对多表没有填充。

请注意,seed方法的运行完全没有错误。

为什么会发生这种情况?当使用Fluent API绕过EF默认值时,多对多关系的种子方式是什么?

是不是Fluent API部分有什么问题/缺失?

EN

回答 1

Stack Overflow用户

发布于 2015-07-09 22:59:28

好的,

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

不能说出哪里出了问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31320659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档