【发布时间】: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