实体框架关系基于导航属性值

时间:2017-09-29 04:16:22

标签: sql-server .net-core ef-fluent-api

我想用流利的api定义一个实体关系,如下所示:

modelBuilder.Entity<TableAEntity>()
            .HasOne(i => i.TableBEntity)
            .WithOne()
            .HasForeignKey<TableAEntity>(i => i.IdX ?? i.IdY)...

甚至可能吗?

此代码段:

[Table("tableA")]
class TableAEntity 
{
  public [Column("idX")] public string IdX { get; set; }
  public [Column("idY")] public string IdY { get; set; }
  public TableBEntity TableBEntity { get; set; }
}

[Table("tableB")]
class TableBEntity 
{
  [Key]
  public int Id { get; set; }
}

产生错误:

  

ArgumentException:属性表达式&#39; i =&gt; (i.IdX ?? i.IdY)&#39;无效。
  表达式应代表属性访问权限:&#39; t =&gt; t.MyProperty&#39 ;.
  指定多个属性时,请使用匿名类型:
  &#t; t =&gt; new {t.MyProperty1,t.MyProperty2}&#39;。
  参数名称:propertyAccessExpression

编辑: 数据库模型:

Link

谢谢

1 个答案:

答案 0 :(得分:2)

是的,这是可能的。

父类必须有一个子项集合...

public class Parent
{
    public int ParentId { get; set; }

    ...

    public virtual ICollection<Child> Childs{ get; set; }
}

并且Child类是对父级及其ID的引用(注意,虚拟关键字很重要)

public class Child
{
    public int ChildId{ get; set; }

    ...

    public int ParentId { get; set; }
    public virtual Parent Parent{ get; set; }
}

流利的就像:

public class ParentChildContext : DbContext
{
    public DbSet<Parent> Parents{ get; set; }
    public DbSet<Child> Childs{ get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // configures one-to-many relationship
        modelBuilder.Entity<Child>()
            .HasRequired<Parent>(c => c.Parent)
            .WithMany(p => p.Childs)
            .HasForeignKey<int>(c => c.ParentId);          }
    }
}

我希望它有所帮助,

注意:看看这些链接,可能会帮助你更多:

http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx

https://msdn.microsoft.com/en-us/library/jj591620(v=vs.113).aspx

Implementing Zero Or One to Zero Or One relationship in EF Code first by Fluent API