我有以下课程
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;?
答案 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的数据类型。