【问题标题】:EF5 - Database First Create Many to Many TableEF5 - 数据库首先创建多对多表
【发布时间】:2013-08-08 06:43:07
【问题描述】:

我的数据库中有一个多对多关系:

CREATE TABLE [dbo].[PositionRequirements](
    [Position_ID] [int] NOT NULL,
    [Requirement_ID] [int] NOT NULL,
 CONSTRAINT [PK_PositionRequirements] PRIMARY KEY CLUSTERED 
(
    [Position_ID] ASC,
    [Requirement_ID] ASC
)

当我在 EF5 中生成模型时,我看不到表,而是在各自的 FK 表中与每侧的两个集合的关联。所以我在Requirements 中有一个Positions 的集合,在Positions 中有一个Requirements 的集合。很公平,我明白这里发生了什么。

我偶然发现了这个问题,展示了如何删除多对多行:

How to add or remove a many-to-many relationship in Entity Framework?

但问题是,我看不到任何方法来泛化此功能,但是如果在模型中定义了一个表,我可以看到这将相对容易。

有没有办法“欺骗” EF 创建 M-M 表,而不是关联集合?

我已经看到this page 以及使用IDatabaseInitializer<> 接口,但它似乎不起作用 - 我在图中没有看到表格。

这将简化我当前项目中的很多事情。

【问题讨论】:

  • 如果向连接表添加额外的标量属性会怎样?
  • 太棒了,谢谢...如此简单(但仍然有点骇人听闻,但它完成了工作!)
  • 为了清楚起见,您需要在数据库中添加另一个字段,删除关联(也包括两个表!)然后从数据库中刷新模型 - 这将创建新表
  • 至少现在我们已经确定这种行为是“设计使然”。应该可以覆盖它。也许其他人会为您的问题提供真正的答案:-)。与此同时,您可以继续使用解决方法。

标签: c# entity-framework many-to-many ef-database-first


【解决方案1】:

希望这会有所帮助。在我的场景中,我有一个列表框,每个项目都有嵌入的复选框。我希望能够添加/删除选中的项目。

下面的“dto”对象是从客户端发送的。它正在检查列表中每个项目的选定状态。如果有人知道任何改进的方法,请留下反馈。

数据库架构:[logger] m:m [logger_to_file_appender] m:m [file_appender] 我的联结表只有 2 个字段 FK,它们充当复合键。正如您所注意到的,EDMX 文件将不包含此联结表。以下是我的解决方案......

file_appender selectedAppender = context.file_appender.Find(dto.Id);

int[] ids = dto.Loggers.Where(x => !x.Selected).Select(x => x.Id).ToArray();
var loggers_to_delete = selectedAppender.logger.Where(x => ids.Contains(x.id));
loggers_to_delete.ToList().ForEach(x =>
{
    selectedAppender.logger.Remove(x);
});

ids = dto.Loggers.Where(x => x.Selected).Select(x => x.Id).ToArray();
var loggers_to_add = context.logger.Where(x => ids.Contains(x.id));
loggers_to_add.ToList().ForEach(x =>
{
    selectedAppender.logger.Add(x);
});

有时在实体框架中工作可能会令人沮丧,因为像这样基本的事情,在 T-SQL 中我需要 2 分钟才能完成,但我花了大约一天的时间来征服:(。希望这些知识可以节省一些时间。

【讨论】:

    猜你喜欢
    • 2015-11-14
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多