Code First惯例混乱

时间:2012-05-16 08:06:17

标签: asp.net-mvc-3 entity-framework html.dropdownlistfor

型号:

public class Status
{
    public int Id { get; set; }
}

public class Podcast
{
    public int Id { get; set; }

    public virtual Status Status { get; set; }
}

Podcast表具有StatusId列,此列是外键。在这种情况下,我收到以下错误消息:Invalid column name 'Status_Id'.为什么? - 很多时候我用这些例子面对那些文章。这是第一个问题。 好的,没问题 - 我在这些列中添加了下划线字符:Sttaus_Id等等。 现在似乎一切正常,但是当我通过以下方式修改我的模型时:

public class Podcast
{
    public int Id { get; set; }

    public int Status_Id { get; set; }

    public virtual Status Status { get; set; }
}

现在我收到以下错误:Invalid column name 'Status_Id1'. 为什么?如果没有这些xx_id属性,我就无法使用DropDownListFor助手。

2 个答案:

答案 0 :(得分:3)

我认为这里的问题是您首先创建了数据库,并为您的FK引用创建了一个名为StatusId的列,但您没有告诉EF您使用的是FK的非默认列名。

以下内容将为您提供您所遵循的结构(ps我同意您的命名惯例,我个人不喜欢fk ID中的_)

    public class MyContext : DbContext
    {
        public DbSet<Podcast> Podcasts { get; set; }
        public DbSet<Status> Status { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Podcast>().HasOptional(p => p.Status)
                .WithMany().HasForeignKey(p => p.StatusId);
            base.OnModelCreating(modelBuilder);
        }
    }

    public class Status
    {
        public int Id { get; set; }
    }

    public class Podcast
    {
        public int Id { get; set; }

        public int? StatusId { get; set; }
        public virtual Status Status { get; set; }
    }

答案 1 :(得分:-1)

至少对于外键字段的约定是表名+字段名,所以在你的情况下StatusId没有下划线。但我不确定为什么会说invalid column name Status_Id1

删除下划线,然后重试。如果您仍然收到错误消息,请使用结果修改您的问题。