实体框架4数据源中缺少导航属性

时间:2011-06-09 06:23:21

标签: silverlight entity-framework-4 junction-table

我的DB包含3个表 - Actors,Films,Actors_Films。其中2个表具有多对多关系(Actors和Films),使用联结表(Actors_Films)建模。

我在Silverlight应用中使用EF4。我创建了一个EF模型,edmx设计器只显示我的Ac tors和Films实体,但它们每个都有一个导航属性到另一个实体(Actors有导航属性Films,而Films有导航属性Actors)

我添加了域名服务,并构建了该项目。以Actors为例我现在想要添加一个视图,其中包含一个允许我在Actors中循环的数据形式,以及一个数据网格,它将显示当前所选actor出现的任何影片。但是,在数据源选项卡中,我有包含2个实体的域上下文 - 演员和电影。这两个实体仅显示其实际列,导航属性未显示:

演员 --- actorId来 --- ActorName

薄膜 --- FilmID --- FilmTitle

这是对的吗?我认为应该显示导航属性。

我的实际应用程序比这更复杂,但这是一个简单的例子,只关注实际问题。

由于

米克

1 个答案:

答案 0 :(得分:1)

WCF Ria服务不支持多对多关系。您必须在edmx上有关联表。为了使Navigate属性出现在客户端上,您必须添加[Include]属性以在Entity的适当元数据中导航属性。通常在创建任何DomainService时生成元数据。例如,我们有许多与许多ContractPosition和OrderPosition的关系:

//ContractPositionsService.metadata.cs
[MetadataTypeAttribute(typeof(ContractPosition.ContractPositionMetadata))]
public partial class ContractPosition
{
    internal sealed class ContractPositionMetadata
    {
        public int ContractPositionId { get; set; }
        [Include]
        public EntityCollection<ContractToOrderLink> ContractToOrderLinks { get; set; }

        ...
    }
//ContractToOrdersLinksService.metadata.cs
[MetadataTypeAttribute(typeof(ContractToOrderLink.ContractToOrderLinkMetadata))]
public partial class ContractToOrderLink
{

    internal sealed class ContractToOrderLinkMetadata
    {
        [Include]
        public ContractPosition ContractPosition { get; set; }

        public int ContractPositionId { get; set; }

        [Include]
        public OrderPosition OrderPosition { get; set; }

        public int OrderPositionId { get; set; }            
    }
}


//OrderPositionsService.metadata.cs
[MetadataTypeAttribute(typeof(OrderPosition.OrderPositionMetadata))]
public partial class OrderPosition
{               
    internal sealed class OrderPositionMetadata
    {
        public int OrderPositionId { get; set; }        

        [Include]
        public EntityCollection<ContractToOrderLink> ContractToOrderLinks { get; set; }

        ...
    }
}