gpt4 book ai didi

asp.net-mvc - EF CF 和现有一对一关系的问题

转载 作者:行者123 更新时间:2023-12-02 18:56:19 24 4
gpt4 key购买 nike

我正在将现有数据库与 EF Code First 一起使用,并使用 modelBuilder 进行配置。我有两个表,其中 SESSION 可以有 SUBJECT,类如下:

public class SessionItem {
[Key]
public int SessionId { get;set; }
// Other Values
public int Subject_ID { get;set; }

public virtual Subject Subject { get;set; }
}

public class SubjectItem {
[Key]
public int Subject_ID { get;set; }
// Other Values

public virtual SessionItem Session { get;set; }
}

然后模型构建器代码是:

modelBuilder.Entity<SessionItem>().ToTable("tblTblSessions");
modelBuilder.Entity<Subject>().ToTable("tblTblSubjects");
modelBuilder.Entity<SessionItem>()
.HasOptional<Subject>(u => u.Subject)
.WithOptionalDependent(c => c.Session).Map(p => p.MapKey("Subject_ID"));

一开始这失败了,直到我从 SessionItem 类中删除了Subject_ID,然后我得到了错误:发生了关系多重性约束违规:EntityReference 不能有超过一个相关对象,但查询返回了多个相关对象。这是一个不可恢复的错误。

知道我哪里出错了吗?

最佳答案

不幸的是one-to-one foreign key associations Entity Framework 不支持,因为 EF 不知道唯一键约束是什么( session 表中的 Subject_ID 列显然有)。

您必须通过将关系映射为一对多来解决此问题。遵循 @flem 的答案中针对 SessionItem 实体和 SubjectItem 实体的映射,或者删除 public virtual SessionItem Session { get;set; } 完全或替换为

public virtual ICollection<SessionItem> Sessions { get; set; }

对于这种关系,您不再需要使用 Fluent API 进行映射,或者如果您愿意,它应该是:

modelBuilder.Entity<SessionItem>()
.HasOptional(se => se.Subject)
.WithMany() // or WithMany(su => su.Sessions)
.HasForeignKey(se => se.Subject_ID);

当您将项目添加到该集合时,您必须确保在业务逻辑中不会添加多个项目,因为您的数据库中不能有多个具有相同 Subject_ID 的行。数据库由于唯一键约束。当您从数据库加载主题(包括 session )时, session 集合要么为空,要么只有一个元素,但不能有更多元素。

关于asp.net-mvc - EF CF 和现有一对一关系的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11613226/

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