EF - 一对一的关系

时间:2013-04-26 12:58:47

标签: entity-framework-5

我有以下课程:

public class FinanceiroLancamento
{
    /// <summary>Identificação</summary>
    public override int Id { get; set; }

    /// <summary>Financeiro caixa</summary>
    public FinanceiroLancamentoCaixa FinanceiroLancamentoCaixa { get; set; }
}

public class FinanceiroLancamentoCaixa
{
    /// <summary>Identificação</summary>
    public override int Id { get; set; }

    /// <summary>Identificação do lançamento financeiro</summary>        
    public int IdFinanceiroLancamento { get; set; }
}

当我尝试映射并执行迁移时,它返回:

物业名称'IdFinanceiroLancamento'已经定义。

要解决这个问题,我需要评论idfinanceirolancamento并按照以下方式进行映射:

        HasRequired(e => e.FinanceiroLancamentoCaixa)
            .WithRequiredPrincipal()
            .Map(m => m.MapKey("IdFinanceiroLancamento"));

问题是:    我怎么能保持“IdFinanceiroLancamento {get; set;}”这个FK(FinanceiroLancamento - &gt; FinanceiroLancamentoCaixa)?

在我的案例中,这对于稍后在课堂上使用非常重要。

Ps:FinanceiroLancamento不需要FinanceiroLancamentoCaixa,但当FinanceiroLancamentoCaixa存在时,他需要一个FinanceiroLancamento。

最好的问候。

Wilton Ruffato Wonrath

1 个答案:

答案 0 :(得分:0)

实体框架要求1:1映射共享相同的主键。在您的情况下,您尝试使用其他成员作为映射ID。另外,不要覆盖基类id,只需继承它。

你想要的是这个:

.HasRequired(e => e.FinanceiroLancamentoCaixa)
.WithRequiredPrincipal();

实体框架不允许您使用不是共享主键的1:1,因此您无法在EF中执行此操作。如果你绝对需要这个,你可能必须把它作为一个存储过程,并从EF调用它。

你不能拥有这样的1:1的原因是因为数据模型允许你将IdFinanceiroLancamento设置为多个记录中的相同ID,从而打破你的1:1。

基本上,EF不允许您创建具有允许违反映射的映射的模型,即使您从不创建重复项,它仍然是可能的。 EF不知道唯一约束,因此放置一个唯一约束不会告诉EF它没关系。

如果你想看到这个功能,我建议你在EF uservoice投票:

http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1050579-unique-constraint-i-e-candidate-key-support