EF5 - 数据库首先创建多对多表

时间:2013-08-08 06:43:08

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

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

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表中与每个边的两个集合相关联。我在Positions中有一个Requirements的集合,在Requirements中有一个Positions的集合。很公平,我明白这里发生了什么。

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

DB Schema:[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);
});

有时候在Entity Framework中工作可能会让人感到沮丧,因为基本的东西,这需要我花费2分钟来完成T-SQL,花了我一天的时间来征服:(。希望这些知识可以节省一些时间。