c# - 为什么 Entity Framework 添加了 '...Id' 字段?

标签 c# entity-framework

我一直在学习 Udemy 上的教程,但似乎在某个地方犯了错误。在一个模型中,EF 似乎添加了一个附加属性作为外键。这是模型:

public class Movie
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public Genre Genre { get; set; }

        public byte GenreId { get; set; }

        [Display(Name = "Number in Stock")]
        public int NumberInStock { get; set; }

        [Display(Name = "Release Date")]
        public DateTime? ReleasedOn { get; set; }

        public DateTime? AddedOn { get; set; }
    }

这是由此生成的迁移 EF:

public override void Up()
        {
            CreateTable(
                "dbo.Movies",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(),
                        GenreId = c.Byte(nullable: false),
                        Genre_Id = c.Int(),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.Genres", t => t.Genre_Id)
                .Index(t => t.Genre_Id);

            CreateTable(
                "dbo.Genres",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(),
                    })
                .PrimaryKey(t => t.Id);

        }

您可以看到它添加了额外的 Genre_Id 属性并将其设置为外键。

为什么会发生这种情况?我该如何解决它?我花了一段时间才注意到,所以自这一次以来我又进行了几次迁移,我是否要遍历所有这些迁移,修复此问题(以某种方式),然后再次备份它们?在数据库上手动更改它是否更容易?或者现在放弃并使用该字段作为外键?

最佳答案

当 Entity Framework 无法自动找出关系时,它会添加一个类似 XXXXX_Id# 的字段。在 Entity Framework 中,外键的数据类型必须与您所关联的实体的数据类型匹配,因此即使名称遵循约定,它也不会被使用。请参阅here用于关系约定。

关于c# - 为什么 Entity Framework 添加了 '...Id' 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49181563/

相关文章:

.net - Entity Framework - 如何检测可恢复与不可恢复的异常

c# - 'x' 上的 'y' 属性无法设置为 'System.Decimal' 值。您必须将此属性设置为类型为 'System.Boolean' 的非空值

c# - 如何在 SELECT TOP 1 上维护 LINQ 延迟执行

asp.net-mvc - Entity Framework 验证的单元测试

c# - 在事件处理程序中使用 "object sender, EventArgs e"

C# 全局热键在第一次最小化到托盘时不起作用,但在显示并再次最小化后它可以工作

c# - 互斥存储过程

c# - 如何在 EF Core 中的Where子句中使用日期?

c# - 基于选择蒙版的切片数组

c# - `There is already an open DataReader` 迭代查询结果时出错