gpt4 book ai didi

entity-framework - 首先使用实体​​框架代码与联结表建立一对多关系

转载 作者:行者123 更新时间:2023-12-02 02:54:50 25 4
gpt4 key购买 nike

我首先使用 EF6 代码创建数据库,并努力使用联结表创建一对多关系。

这是我正在尝试做的事情的示例:

Foo 实体可以包含任意数量 (0-n) 个 Bar 实体,但是 Bar 实体不一定属于 Foo。我可能希望另一种类型的实体也包含一个或多个 Bar,因此 Bar 不包含其父级的外键非常重要。

因此连接表将如下所示:

Name        | FooBar
------------|-------
Primary Key | BarID
Key | FooID

因此,如果我们按如下方式创建实体:

public class Foo
{
public long ID { get; set; }
public ICollection<Bar> Bars { get; set; }
}

public class Bar
{
public long ID { get; set; }
}

然后配置它们:

public class FooConfiguration : EntityTypeConfiguration<Foo>
{
HasKey(p => p.ID);
HasMany(p => p.Bars)
.WithRequired()
.Map(m => {
m.ToTable("FooBar");
m.MapKey("FooKey");
});
}

但这会导致抛出以下异常:

mscorlib.dll 中发生“System.InvalidOperationException”类型的异常,但未在用户代码中进行处理。附加信息:在模型中找不到指定的表“FooBar”。确保表名已正确指定。

不幸的是,我不确定这意味着什么 - 我需要创建一个单独的 FooBar 实体吗?

如何配置这些实体以便正确创建连接表?

谢谢!

最佳答案

很抱歉复活这个线程,但我想分享一个我创建的实用程序,用于处理具有许多此类关系实例的 WebApi。我们有多个业务对象,每个对象都与 EventHistory、消息、文件等有关系,并且跟踪所有 FluentAPI 函数非常困惑。这是我想到的:

    /// <summary>
/// Maps a many-to-many relationship that can only be navigated from TSource to TTarget.
/// </summary>
/// <typeparam name="TSource">Source type that can navigate to TTarget.</typeparam>
/// <typeparam name="TTarget">Target type that has no direct link back to TSource.</typeparam>
/// <param name="modelBuilder">An instance of DbModelBuilder</param>
/// <param name="expr">Lambda expression specifying the navigation property for this relationship from TSource to TTarget.</param>
/// <param name="leftKey">Optional argument to override the foreign key to TSource</param>
/// <param name="rightKey">Optional argument to override the foreign key to TTarget</param>
public static void MapDirectionalManyToMany<TSource, TTarget>(DbModelBuilder modelBuilder, Expression<Func<TSource, ICollection<TTarget>>> expr, string tableName = null, string leftKey = null, string rightKey = null)
where TSource : class
where TTarget : class {

modelBuilder.Entity<TSource>()
.HasMany(expr)
.WithMany()
.Map(m => {
m.MapLeftKey(leftKey ?? typeof(TSource).Name + "Id");
m.MapRightKey(rightKey ?? typeof(TTarget).Name + "Id");
m.ToTable(tableName ?? typeof(TSource).Name + typeof(TTarget).Name);
});

}

我像这样应用关系:

ModelUtils.MapDirectionalManyToMany<MyResourceModel, SharedHistoryModel>(modelBuilder, x => x.History);
ModelUtils.MapDirectionalManyToMany<OtherResourceModel, SharedHistoryModel>(modelBuilder, x => x.History, "renamed_history");

关于entity-framework - 首先使用实体​​框架代码与联结表建立一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32970402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com