gpt4 book ai didi

c# - 帮助程序/中间类在数据库中没有列( Entity Framework )

转载 作者:太空宇宙 更新时间:2023-11-03 10:23:31 28 4
gpt4 key购买 nike

首先,我是 Entity Framework 的新手,正在从我自己编写的数据库框架迁移现有项目,因此我在选择解决方案时具有相当大的灵 active 。

到目前为止,根据我的研究,一切似乎都已正确设置。但是,当我构建数据库时,我编写的帮助程序类的表中没有任何列(在其主键之外)。下面包含这些类的最简化版本,它们的关系在 Fluent API 中定义。

public class Concept
{
public long ID { get; set; }

[Index(IsUnique = true), MaxLength(255)]
public string Name { get; set; }
}

public class Tag
{
public long ID { get; set; }
public virtual Content Subject { get; set; }
public virtual Concept Concept { get; set; }
}

public class Helper
{
public long ID { get; set; }
public virtual Content Subject { get; set; }
public virtual List<Tag> Instances { get; set; }

// Helper functionality
}

public class Content
{
public long ID { get; set; }
public virtual Helper Helper { get; set; }

public Content() { Helper = new Helper() { Subject = this }; }
}

上下文

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Tag>()
.HasRequired(t => t.Concept);
modelBuilder.Entity<Tag>()
.HasRequired(t => t.Subject);

modelBuilder.Entity<Helper>()
.HasRequired(t => t.Subject)
.WithRequiredDependent(c => c.Helper);
modelBuilder.Entity<Helper>()
.HasMany(t => t.Instances);

modelBuilder.Entity<Content>()
.HasRequired(c => c.Helper)
.WithRequiredPrincipal();

base.OnModelCreating(modelBuilder);
}

Program.cs

static void Main(string[] args)
{
Content content = null;
using (var context = new Context())
{
content = context.Content.Find(1);
if (content == null)
{
content = new Content();

context.Content.Add(content);
context.Helper.Add(content.Helper);
context.SaveChanges();
}
}
}

还值得一提的是,当数据被保存时,Helper 被分配了一个 ID,但是在第二次加载父类(Content)时,Helper 并没有像我期望的'virtual'关键字那样延迟加载.我怀疑这是由导致表中缺少数据的同一问题引起的。

我已经尝试了 EF 提供的数据注释和流畅的 API 方法,但似乎有一些基本的东西我误解了。我想保留这个助手类,因为它有助于更​​好地组织代码。

由于我花了相当多的时间研究这些关系/API,并搜索了 Google/SO 但没有找到任何解决此问题的方法,特别是任何帮助将不胜感激!

更新:解决方案

感谢评论中的一个问题,我意识到我期望在实体类型本身的表中(即在 Helpers 表中)看到多对多关系的键。但是,在多对多关系中,键将始终放置在之前未创建的单独表中(类型名称的串联)。

通过添加“.WithMany();”到 OnModelCreating 函数的 Helper 部分,如下所示

modelBuilder.Entity<Helper>()
.HasMany(t => t.Instances)
.WithMany();

正确定义了多对多关系,并按预期生成了 HelperTags 表。这是因为多对多关系是一种方式(Helpers 总是引用 Tags,Tags 从不引用 Helpers)。这也是 'WithMany' 没有任何参数的原因(因为 Tag 类中不存在 Helper 属性)。解决这个简单的疏忽问题就解决了!

最佳答案

在 ModelCreate 中,您可能比需要更努力地工作。您可能应该使用标识符重新设计您的类,如下所示:

public class Tag
{
public long Id { get; set; }

public long SubjectId { get; set; }
public long ConceptId { get; set; }

public virtual Content Subject { get; set; }
public virtual Concept Concept { get; set; }
}

您需要使 ID 名称与对象名称 + Id 完全相同,EF 会神奇地将所有内容链接起来。如果您不希望它们被要求,则使 id 可以为 null (C# 6 == long?SubjectId)。

此外,我已经更改了ID -> Id;我不知道这是否重要。我记得有一次我必须这样做才能让事情正常进行(那是几年前的事了),从那以后我就一直这样做。

关于c# - 帮助程序/中间类在数据库中没有列( Entity Framework ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32489812/

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