0

好的,我在尝试将一些 POCO 类映射到不是我创建的数据库时遇到了一个奇怪的情况。

这是表的设置。

TableA
(
    TableA_ID int primary key,
    // other fields
)

TableB
(
    TableB_ID int primary key,
    TableA_ID int unique not null,
    // other fields
)

因此,这些表应该如何协同工作是 TableB 具有对 TableA 的引用——并且它是一对一的关系。但是,TableA 没有 TableB 主键的外键。

我显然可以建立以下关系

public class TableA
{
    public int TableA_ID { get; set; }

    public virtual ICollection<TableB> TableBs { get; set; }
}

public class TableB
{
    public int TableB_ID { get; set; }
    public int TableA_ID { get; set; }

    public virtual TableA TableA { get; set; }
}

有了这个设置,我可以说 - 这可以正常工作:

TableA.TableBs.FirstOrDefault().SomeField;

但是,我真正想要的是这个

public class TableA
{
    public int TableA_ID { get; set; }

    public virtual TableB TableB { get; set; }
}

public class TableB
{
    public int TableB_ID { get; set; }
    public int TableA_ID { get; set; }

    public virtual TableA TableA { get; set; }
}

有了这个设置,我可以说:

TableA.TableB.SomeField;

有什么方法可以将 TableA 中的 TableA_ID 映射到 TableB 中的 TableA_ID 以使 TableA 类按我想要的方式工作?

4

2 回答 2

0

one-to-one关系上,EF 将使用PK表 A(在本例中)PK作为表 B。您的TableB类应如下所示:

public class TableB
{
    public int TableB_ID {get;set;}
    public virtual TableA TableA {get;set;}
}

不需要包括TableA_ID,因为两者都是PK一样的。

builder.Entity<TableA>()
    .HasOptional(a => a.TableB)
    .WithRequired(b => b.TableA)
于 2013-07-09T20:28:00.470 回答
0

我想在这个答案的开头加上我不建议定期使用这个解决方案的免责声明。这不是我让它工作的理想方式 - 但从技术角度来看 - 对于我的特殊情况 - 它应该工作得很好。

理想情况下,我真的很想在 TableA 表中有一个 TableB_ID 字段。这将是 TableB 表的适当外键 - 一切都会很好。

话虽如此。因为 TableB 表上的 TableA_ID 字段是唯一的并且不为空 - 并且 - 因为您能够明确告诉 EF 使用什么作为主键和外键 - 我能够对 EF 撒谎并使其用于 TableB 的 TableA_ID字段作为主键。因此,我能够告诉 TableA 它的 TableA_ID 字段是我的 TableB 引用的外键,并且一切正常。

这是我用来告诉 EF 这个谎言的 fluent API 位。

在我在 OnModelCreating 覆盖中实例化的 TableB EntityTypeConfiguration 中,我说以下内容。

this.HasKey(t => t.TableA_ID);
this.HasRequired(b => b.TableA).WithOptional(a => a.TableB);

这放入了必要的位,以使所有内容都正确指向我的情况。TableB 最终通过 TableA_ID 列具有到 TableA 的必需链接 - 而 TableA 也通过 TableA_ID 列具有到 TableB 的可选链接。

而且,当然,因为我对 EF 撒了谎,并特别告诉它 TableB 的 TableA_ID 字段是主键 - TableB 表的 TableB_ID 没有这样标记。

于 2013-07-12T11:49:46.530 回答