繁体   English   中英

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

[英]Entity Framework many to many relationship with extra field (Database First)

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

Project
  - ProjectId (PK)
  - Name

ContentType
  - ContentTypeId (PK)
  - Name

ProjectContentTypeMapping
  - ProjectId (PK)
  - ContentTypeId (PK)

在这种情况下,一切工作正常,我可以从ContentTypes访问Projects,也可以通过导航属性访问Projects。

但是,我需要有一些额外的字段,这些字段特定于Projects和ContentTypes之间的关系,并且应该是ProjectContentTypeMapping表中的额外列。 添加这些内容后,我便失去了导航属性,并且EF在设计器中显示了映射表。

有什么方法可以在EF(数据库优先)中手动配置这两个表之间的映射? 另外,我该如何表示呢? 我本来是想在映射表上添加一个额外的带有“ FK”的“元数据”表,但是对我来说它看起来像“ hacky”。

谢谢

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

让我们以您的课程为例:

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不再是映射表,因此,如果ProjectID存在于ProjectContentTypeMapping表中,则删除Project会给您一个错误; 您将必须手动删除它们,即

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM