C# 实体框架与额外字段的多对多关系(数据库优先)

C# 实体框架与额外字段的多对多关系(数据库优先),c#,database,entity-framework,ef-database-first,C#,Database,Entity Framework,Ef Database First,我有一个在数据访问层首先使用实体框架(EF)数据库的程序。我知道为了让EF自动生成多对多关系的导航属性,映射表只需要包含一个复合主键: Project - ProjectId (PK) - Name ContentType - ContentTypeId (PK) - Name ProjectContentTypeMapping - ProjectId (PK) - ContentTypeId (PK) 在这种情况下,一切正常,我可以通过ContentTypes访问

我有一个在数据访问层首先使用实体框架(EF)数据库的程序。我知道为了让EF自动生成多对多关系的导航属性,映射表只需要包含一个复合主键:

Project
  - ProjectId (PK)
  - Name

ContentType
  - ContentTypeId (PK)
  - Name

ProjectContentTypeMapping
  - ProjectId (PK)
  - ContentTypeId (PK)
在这种情况下,一切正常,我可以通过ContentTypes访问项目,也可以通过导航属性访问项目

但是,我有一个要求,就是要有额外的字段,这些字段是项目和ContentTypes之间的关系所特有的,这将是ProjectContentTypeMapping表中的额外列。一旦我添加了这些属性,我就会释放导航属性,EF会在设计器中显示映射表

是否有任何方法可以在EF(数据库优先)中手动配置这两个表之间的映射?或者,我如何表示这一点?我想可能有一个额外的“元数据”表,映射表中有一个FK,但在我看来,它看起来很“黑”


谢谢

否,在实体框架中的映射表中不能有额外的列。 因为,拥有一个额外的列意味着您打算使用它,但映射表不是实体的一部分,因此,实体框架不再将具有额外列的映射表视为映射表。您必须手动操作映射

让我们以您的类为例:

Project
  - ProjectId (PK)
  - Name
  - ProjectContents

ContentType
  - ContentTypeId (PK)
  - Name
  - ProjectContents

ProjectContentTypeMapping
  - ProjectId (PK)
  - ContentTypeId (PK)
  - OtherRelevantColumn
其中ProjectContents的类型为
ProjectContentTypeMapping

因此,无论何时添加具有特定ContentType的项目,您都将执行以下操作:

Project prj = new Project();
//fill out scalar properties
ProjectContentTypeMapping pctm = new ProjectContentTypeMapping();
pctm.ContentTypeId = 1; //or whatever you want, or selected from UI

prj.ProjectContents = new ProjectContentTypeMapping();
prj.ProjectContents.Add(pctm);

dataContext.Projects.Add(prj);
现在,在对现有项目进行编辑(添加ContentTypes)的情况下,您不会执行
prj.ProjectContents=new…
,而只会在它为null时执行此操作,即

if(prj.ProjectContents==null)
   prj.ProjectContents = new ProjectContentTypeMapping();
还有一件非常重要的事情,因为现在您的ProjectContentTypeMapping不再是一个映射表,所以,如果项目的id出现在ProjectContentTypeMapping表中,则删除项目会给您带来错误;您必须手动删除它们,即

foreach(var pctm in prj.ProjectContents.ToList())
{
   prj.ProjectContents.Remove(pctm);
   datacontext.ProjectContentTypeMappings.Remove(pctm);
}
datacontext.Remove(prj);
datacontext.SaveChanges();

您可以提供更多关于如何手动操作映射的信息吗?是否可以拥有额外的列,但告诉Entity Framework将表视为不可能?以某种方式只导入两列,而不是从数据库中导入整个表?出于其他原因(工作场所策略、使用相同数据库的其他应用程序),我需要数据库中的其他列,但我的应用程序甚至不需要知道它们。