在我们有两个类的映射中也遇到了一个问题
public class Customer
{
public int Id;
public CustomerAddress StatementAddress
public bool AlwaysTrue => true;
public string Code;
}
public class CustomerAddress
{
public int Id;
public bool ForStatement;
public string _CustomerCode
}
我们将像这样设置映射:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>()
.HasOne(s => s.StatementAddress)
.WithMany()
.HasPrincipalKey(x=> new {x._CustomerCode, x.ForStatement})
.HasForeignKey(s => new { s.Code, s.AlwaysTrue});
}
但是,这引起了一个问题,因为它似乎是在数据库中寻找Customer表中的StatementAddress_CustomerCode和StatementAddress_ForStatement列,这显然不存在-为什么不查找代码表并简单地传递它呢?通过True for AlwaysTrue?
我本以为它的定义键只是使用Code和Alwaystrue值的方式,但似乎正在寻找由属性名称组合组成的两列,并在另一个类中附加了属性名称= /
答案 0 :(得分:0)
我在这里建议两件事:
您可以像这样手动定义列名称:
public class Customer
{
public int Id;
public CustomerAddress StatementAddress;
[Column("StatementAddress_ForStatement")]
public bool AlwaysTrue => true;
[Column("StatementAddress_CustomerCode")]
public string Code;
}
您可以使用ForeignKeyAttribute
指定外键,如下所示:
public class Customer
{
public int Id;
public CustomerAddress StatementAddress;
[ForeignKey("StatementAddress"), Column(Order = 1)]
public bool AlwaysTrue => true;
[ForeignKey("StatementAddress"), Column(Order = 0)]
public string Code;
}
请记住,对于此选项,您必须将列顺序属性设置为与CustomerAddress
表中的外键所具有的属性相匹配。
希望这会有所帮助!
答案 1 :(得分:0)
所以,要结束这一点-
这是EF Core(2.1)中目前无法实现的,是否会在将来的版本中添加还有待观察-目前,它仅支持通过单个属性进行映射