2011-06-09 60 views
2

我有包含3个表 - 演员,电影,Actors_Films的数据库。其中2个表格具有多对多关系(Actors和Films),它们使用联结表(Actors_Films)建模。实体框架4从数据源丢失的导航属性

我在Silverlight应用程序中使用EF4。我创建了一个EF模型,edmx设计器只显示了我的Acctors和Films实体,但它们每个都有一个导航属性给另一个实体(Actor具有Films的导航属性,Films具有Actor的导航属性) 。

我已经添加了一个域服务,并构建了该项目。以演员为例我现在想添加一个包含数据表的视图,这个数据表可以让我在Actors中循环,还有一个数据网格,它将显示当前选中的演员出现的任何电影。但是,在数据源选项卡中,我有包含2个实体的域上下文 - Actor和Films。这2个实体只显示自己的实际列,导航性能没有出现:

演员 --- actorId来 --- ActorName

电影 --- FilmID --- FilmTitle

这是正确的吗?我认为导航属性应该显示出来。

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

感谢

米克

回答

1

WCF RIA服务不支持多对多关系。您必须在edmx上有关联表。为了使Navigate属性出现在客户端上,您必须添加[Include]属性以在实体的适当元数据中导航属性。元数据通常在您创建任何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; } 

     ... 
    } 
} 
+0

感谢MaxWave。这回答了我的问题。 – MJM 2011-06-09 09:29:05