我有以下型号和配置:
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
,依此类推:
我也尝试使用HasRequired()
进行映射,但该属性仍会生成与实际类型匹配的列名,而不是属性名称。任何帮助将不胜感激。
答案 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);
}
}