【问题标题】:Entity Framework, two Many to Many relationship to same object using Fluent API实体框架,使用 Fluent API 与同一对象的两个多对多关系
【发布时间】:2012-04-23 14:58:03
【问题描述】:

我正在尝试使用流利的 api 定义与同一对象的两个多对多关系。

这是简化模型:

public class PurchaseRequisition
{
    [Key, ForeignKey("Transaction")]
    public int TransactionId { get; set; }
    public virtual ICollection<People> RequisitionedBys { get; set; }
    public virtual ICollection<People> AuthorizedSignatures { get; set; }
}

public class People
{
    [Key]
    public string Id{ get; set; }
    public string FullName { get; set; }
    public virtual ICollection<PurchaseRequisition> PurchaseRequisitionsForRequisitionedBys { get; set; }
    public virtual ICollection<PurchaseRequisition> PurchaseRequisitionsForAuthorizedSignatures { get; set; }
}

这里是流畅的api代码:

modelBuilder.Entity<PurchaseRequisition>()
.HasMany(a => a.RequisitionedBys)
.WithMany(b => b.PurchaseRequisitionsForRequisitionedBys)
.Map(x =>
{
    x.MapLeftKey("PurchaseRequisitionId");
    x.MapRightKey("RequisitionedById");
        x.ToTable("PurchaseRequisitionRequisitionedBy");
});

modelBuilder.Entity<PurchaseRequisition>()
.HasMany(a => a.AuthorizedSignatures)
.WithMany(b =>b.PurchaseRequisitionsForAuthorizedSignatures)
.Map(x =>
{
    x.MapLeftKey("PurchaseRequisitionId");
    x.MapRightKey("AuthorizedSignatureId");
    x.ToTable("PurchaseRequisitionAuthorizedSignature");
});

我想要的是生成两个单独的链接表,但 EF 生成的是 People 表中 PurchaseRequisition 的两个外键列和 PurchaseRequisition 字段中 People 的 1 个外键列。

谁能告诉我可能出了什么问题?

【问题讨论】:

  • 映射看起来正确。如果达到模型构建器代码,您是否签入调试器?
  • 我检查了,似乎我的代码没有被访问。
  • 您的模型是来自 DB-First 还是 Model-First?特别是,连接字符串是否包含 EDM 元数据部分?如果是,则必须删除它(使用没有元数据部分的简单连接字符串)才能使用 Code-First,否则根本不会调用 OnModelCreating
  • 谢谢!它现在正在工作。无论如何,我使用代码优先的方法来创建数据库。我认为由于我对模型类进行了更改,它会自动删除并重新创建数据库,因为这是我在初始化程序代码中指定的。只有当我向我的应用程序发出访问数据库的请求时,它才会运行模型构建器代码。
  • 您可能只是设置初始化程序(SetInitializer)。这不会运行初始化。它在您第一次使用上下文实例访问数据库时运行,或者您可以使用context.Database.Initialize(false); 强制它运行。

标签: asp.net-mvc-3 entity-framework many-to-many


【解决方案1】:

问题已解决。

我错误地认为我的数据库初始化程序代码会删除并重新创建数据库,因为我对模型类进行了更改并且我的初始化程序类扩展了 DropCreateDatabaseIfModelChanges。

正如 Slauma 所建议的,即使模型已更改,也没有达到流畅的 api 代码。我正在使用 SetInitializer() 方法设置初始化程序,并且此代码仅在我第一次使用上下文实例访问数据库时运行。

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多