我的DB:中有一个多对多关系
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
的集合。公平地说,我理解这里发生的事情。
我偶然发现了这个问题,展示了如何删除多对多行:
如何在实体框架中添加或删除多对多关系?
然而,问题是,我看不出任何方法来概括这种功能,然而,如果在模型中定义了一个表,我可以看到这将相对容易。
有没有一种方法可以"欺骗"EF创建M-M表,而不是关联集合?
我在使用IDatabaseInitializer<>
接口时看到了这个页面,但它似乎不起作用——我在图表中没有看到表。
这将简化我当前项目中的许多事情。
希望这能有所帮助。在我的场景中,我有一个列表框,每个项目都嵌入了复选框。我希望能够添加/删除选中的项目。
下面的"dto"对象是从客户端发送的。它检查列表中每个项目的选定状态。如果有人知道有什么方法可以改进这一点,请留下反馈。
数据库架构:[logger]m:m[logger_to_file_appender]m:m[file_appender]我的连接表只有两个字段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);
});
有时,在实体框架中工作可能会令人沮丧,因为像这样基本的事情,我需要2分钟才能在T-SQL中完成,我花了大约一天的时间来克服:(。希望这些知识能为某人节省几个小时。