为什么实体框架已添加' ... Id'领域?

时间:2018-03-08 20:03:37

标签: 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属性并将其设置为外键。

为什么会这样?我该如何解决?我需要一段时间才能注意到这一点,因此我还有几次迁移,我是否已经完成了所有迁移,修复此问题(某种程度上),并再次通过它们进行备份?在数据库上手动更改它更容易吗?或者现在放弃并使用该字段作为外键?

1 个答案:

答案 0 :(得分:1)

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