实体框架+存储库模式和外键更新不更新相关实体

时间:2013-02-15 13:54:06

标签: entity-framework repository-pattern unit-of-work navigation-properties

我正在使用Entity Framework 5和UnitOfWork + Repository模式。

我正在尝试创建以下实体:

public partial class ViaggioAttivita
{
    public System.Guid Id { get; set; }
    public System.Guid IdViaggio { get; set; }
    public virtual Viaggio Viaggio { get; set; }
}

public partial class Viaggio
{
    public System.Guid Id { get; set; }
    public virtual ICollection<ViaggioAttivita> ViaggiAttivita { get; set; }
}

我注意到当我创建填充IdViaggio的新ViaggioAttivita实体时,当我这样做时

ViaggioAttivita attivita = new ViaggioAttivita();
attivita.IdViaggio = ParentId;
unitOfWork.ViaggiAttivitaRepository.Insert(attivita);

导航属性attivita.Viaggio没有更新。

如果我直接更新attivita.Viaggio而不是Id

ViaggioAttivita attivita = new ViaggioAttivita();
attivita.Viaggio = unitOfWork.ViaggiRepository.GetByID(ParentId);
unitOfWork.ViaggiAttivitaRepository.Insert(attivita);

Viaggio当然会更新,但IdViaggio键也会更新。

我错过了什么?

为什么我会有这种差异?

我尝试调用.Save()但没有任何变化。

如果我手动更新实体,关系似乎只会更新,但如果我只更新密钥则不会更新。

谢谢

修改1:

我在Sql Server 2008,MVC3,Entity Framework 5(当然是运行时v4.0.30319)。 Database First模式。这两个表有关系(当然,否则它不会使用第二种方法填充Key)。

编辑2:

我尝试过去一些EDMX信息;

<EntityType Name="Viaggio">
    <Key>
      <PropertyRef Name="Id" />
    </Key>
    <Property Name="Id" Type="Guid" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
    <NavigationProperty Name="ViaggiAttivita" Relationship="DatabaseModel.FK_ViaggiAttivita_Viaggi" FromRole="Viaggi" ToRole="ViaggiAttivita" />
  </EntityType>

  <EntityType Name="ViaggioAttivita">
    <Key>
      <PropertyRef Name="Id" />
    </Key>
    <Property Name="Id" Type="Guid" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
    <Property Name="IdViaggio" Type="Guid" Nullable="false" />
    <NavigationProperty Name="Viaggio" Relationship="DatabaseModel.FK_ViaggiAttivita_Viaggi" FromRole="ViaggiAttivita" ToRole="Viaggi" />
  </EntityType>




 <AssociationSet Name="FK_ViaggiAttivita_Viaggi" Association="DatabaseModel.FK_ViaggiAttivita_Viaggi">
      <End Role="Viaggi" EntitySet="Viaggi" />
      <End Role="ViaggiAttivita" EntitySet="ViaggiAttivita" />
    </AssociationSet>

1 个答案:

答案 0 :(得分:0)

区别在于:

a)仅设置外键。(Id)如果此实体已加载到缓存中,则可以设置Navigation属性。如果它没有加载,那么你需要触发加载。您可以搜索如何或何时自动完成此操作。请参阅主题延迟加载与.include

b)使用实体设置导航属性。 外键ID字段支持导航属性。 现在EF可以看到Nav属性及其键。它可以使用已有的数据设置ID。无需从DB加载。所以它已经确定。