2

我正在使用 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)。数据库优先模式。这两个表是有关系的(当然,否则不会使用第二种方法填充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>
4

1 回答 1

0

区别在于:

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

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

于 2013-02-17T15:21:55.667 回答