gpt4 book ai didi

c# - Entity Framework 与额外字段的多对多关系(数据库优先)

转载 作者:太空狗 更新时间:2023-10-29 22:59:49 25 4
gpt4 key购买 nike

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

Project
- ProjectId (PK)
- Name

ContentType
- ContentTypeId (PK)
- Name

ProjectContentTypeMapping
- ProjectId (PK)
- ContentTypeId (PK)

在这种情况下,一切正常,我可以从 ContentTypes 访问项目,反之亦然。

但是我需要有额外的字段,这些字段特定于 Projects 和 ContentTypes 之间的关系,这将是 ProjectContentTypeMapping 表中的额外列。添加这些后,我将松开导航属性,EF 会在设计器中显示映射表。

有什么方法可以在 EF(数据库优先)中手动配置这两个表之间的映射?或者,我该如何表示呢?我在想也许有一个额外的“元数据”表,带有 FK 到映射表,但它对我来说看起来“hacky”...

谢谢

最佳答案

不, Entity Framework 中的映射表中不能有额外列。因为,有一个额外的列意味着你打算使用它,但是 Mapping 表不是实体的一部分,所以, Entity Framework 不再将你的带有额外列的映射表视为一个 Mapping 表。您将必须手动操作映射。

让我们以您的类(class)为例:

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 i 时执行它, e,

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();

关于c# - Entity Framework 与额外字段的多对多关系(数据库优先),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18613912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com