Code-First CTP5导航属性生成错误的列名

时间:2010-12-28 01:12:48

标签: c# entity-framework code-first

我有以下型号和配置:

public class User
{
    public int Id { get; set; }
    public User CreatedBy { get; set; }
    public DateTime? DateCreated { get; set; }
    public string Name { get; set; }
    public string Username { get; set; }
}

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        this.HasKey(t => t.Id);

        this.HasOptional(u => u.CreatedBy);
        this.Property(u => u.DateCreated);

        this.Property(u => u.Name).HasMaxLength(64);
        this.Property(u => u.Username).HasMaxLength(64);
    }
}

public class SampleContext : DbContext
{

    public IDbSet<User> Users { get; set; }

    public SampleContext(string dbConnection)
        : base(dbConnection)
    {

    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new UserConfiguration());
    }
}

我可以使用上下文并添加用户就好了。然后,我查看Code First生成的表,并意识到CreatedBy属性不会生成CreatedById列,而是生成UserId列。如果我添加其他属性,例如ModifiedBy,则会生成UserId1,依此类推:

alt text

我也尝试使用HasRequired()进行映射,但该属性仍会生成与实际类型匹配的列名,而不是属性名称。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您基本上想要使用自定义外键列名创建自引用独立关联,以下是执行此操作的流畅API代码:

public UserConfiguration()
{
    this.HasRequired(u => u.CreatedBy)
        .WithMany()
        .IsIndependent()
        .Map(m => 
        {
            m.MapKey(u => u.Id, "CreatedById");
        });
}

但是,由于CTP5中的错误,此代码会引发异常。因此,目前,您可以在MSDN论坛中使用建议的解决方法(将您的独立关联更改为FK关联并明确命名您的FK属性)并在明年为RTM保存此代码。

答案 1 :(得分:0)

我越过posted this on the MSDN forums,我想到目前为止,这是设计的。所有导航属性都会为列名生成类型名称 + Id。对我而言,这是代码优先的基本设计缺陷。生成的名称甚至不反映列(除了它是用户)。

答案 2 :(得分:0)

您可以使用HasColumnName(...)

否决默认列名
public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
         this.HasKey(t => t.Id);

         this.HasOptional(u => u.CreatedBy);
         // Map the 'DateCreated' Property to the 'CreatedById' table field.
         this.Property(u => u.DateCreated).HasColumnName("CreatedById");

         this.Property(u => u.Name).HasMaxLength(64);
         this.Property(u => u.Username).HasMaxLength(64);
     }
 }