【问题标题】:EF 6.0 Many to many relationship is not working in codefirstEF 6.0 多对多关系首先在代码中不起作用
【发布时间】:2019-02-27 22:40:26
【问题描述】:

我在数据库中有以下结构:

对于上述内容,我在 EF 6.0 CodeFirst 的 C# 代码中有以下内容。

[Table("Person")]
public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long Id { get; set; }

    [Column("FullName")]
    [MaxLength(200)]
    public string Name { get; set; }

    public virtual ICollection<Task> Tasks { get; set; } = new HashSet<Task>();
}



[Table("Task")]
public class Task
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long Id { get; set; }

    [Column("FullName")]
    [MaxLength(200)]
    public string Title { get; set; }

    public virtual ICollection<User> Users { get; set; } = new HashSet<User>();
}

问题是集合根本没有被填充并且总是返回为空。例如,如果我尝试:

userRepository.All.Include(x=>x.Tasks).Where(x=> x.FullName == "John").Select(x=> x.Tasks.Title).ToList();

InnerException = {"无效的对象名称'dbo.PersonTask'。"}

我的代码有什么问题?

【问题讨论】:

  • 那么在您的数据库中有一个名为dbo.PersonTask 的表吗?错误消息表明没有,您的映射可能已关闭。
  • 是的,但我没有任何映射,因为它没有有用的字段
  • SQL Server 认为您的数据库中没有这样的对象。也许你的连接字符串是错误的。
  • 如果您打算将 Table PersonTask 用于映射表,请创建并应用迁移步骤。如果要重用具有不同名称的现有表,请使用 .HasMany().WithMany().Map(m=>m.ToTable()) 函数。
  • 有趣。它不能自己挑选所有这些信息吗?这些表已经存在。我们从不使用代码在数据库中构建任何东西

标签: c# sql-server entity-framework ef-code-first many-to-many


【解决方案1】:

您在数据库中没有PersonTask 表,因此在数据库中找不到实体。您必须创建映射表。

【讨论】:

  • 我什至有数据。在数据库中,我的一位同事也有类似的事情,但他也有中间表的映射并且它在那里工作。你认为我也需要一个中级课程吗?
  • 是的,你需要它
猜你喜欢
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多