更改导航属性的默认列名称

时间:2017-09-07 08:07:50

标签: c# asp.net asp.net-core entity-framework-core

我有以下课程

public class TreeItem
{
    public long Id { get; set; }
    public Tree Tree { get; set; }
    public string Model { get; set; }
    public string Version { get; protected set; }
    public string Index { get; protected set; }
}

我想更改默认数据库的属性Tree的列名。作为默认实体框架寻找" TreeId"数据库中的列,但我们的名称约定表示此列应命名为" tree_id"

如果我尝试将其设置如下:

 modelBuilder.Entity<TreeItem>().Property(t => t.Tree).HasColumnName("tree_id");

Ef会在邮件中抛出异常:

  

无法为该物业调用物业&#39;树&#39;在实体类型&#39; TreeItem&#39;   因为它被配置为导航属性。物业只能   用于配置标量属性。

是否可以从&#34; TreeId&#34;更改属性树的默认列名称。到&#34; tree_id&#34;?

2 个答案:

答案 0 :(得分:5)

尝试使用MapKey():

modelBuilder.Entity<TreeItem>()
            .HasRequired(it => it.Tree)
            .WithMany()
            .Map(m => m.MapKey("tree_id"));

修改

对于EF Core,您可能必须使用上述here

中的解决方法
modelBuilder.Entity<TreeItem>()
            .Property<long>("TreeId")
            .HasColumnName("tree_id");

答案 1 :(得分:0)

在将两个实体相互关联时,我总是使用虚拟对象。执行此操作时,您还可以指定FK的列名称,如下所示:

public class TreeItem
{
    public long Id { get; set; }
    [Column("tree_id")]
    public int TreeId { get; set; }
    [ForeignKey("TreeId")]
    public virtual Tree Tree { get; set; }
    public string Model { get; set; }
    public string Version { get; protected set; }
    public string Index { get; protected set; }
}

public class Tree
{
    public int Id { get; set; }
    public string Name { get; set; }
}

在数据库中生成此表(我刚刚创建了Tree类作为测试示例)如果它的id也很长,请确保也改变TreeItem类中TreeId的数据类型。

enter image description here