我正在使用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>
答案 0 :(得分:0)
区别在于:
a)仅设置外键。(Id)如果此实体已加载到缓存中,则可以设置Navigation属性。如果它没有加载,那么你需要触发加载。您可以搜索如何或何时自动完成此操作。请参阅主题延迟加载与.include
b)使用实体设置导航属性。 外键ID字段支持导航属性。 现在EF可以看到Nav属性及其键。它可以使用已有的数据设置ID。无需从DB加载。所以它已经确定。