Silverlight 在客户端公开自定义服务器端实体框架属性

Silverlight 在客户端公开自定义服务器端实体框架属性,silverlight,wcf,entity-framework,wcf-ria-services,Silverlight,Wcf,Entity Framework,Wcf Ria Services,我正在使用WCF RIA服务制作一个Silverlight 4应用程序 在服务器端(*.Web项目),我有一个从SQL server数据库自动生成的实体模型。 在客户端,我有VisualStudio生成的域服务和代理对象,用于Silverlight程序集 我想向模型中添加自定义属性(最好是在服务器端)。 假设我有联系人、公司和地址表,这些表由外键链接(但不一定是实际的外键约束)。我想添加一个属性,该属性将返回联系人的公司的地址的对象 我一直试图通过创建一个分部类来扩展Contact类,并添加一个

我正在使用WCF RIA服务制作一个Silverlight 4应用程序

在服务器端(
*.Web
项目),我有一个从SQL server数据库自动生成的实体模型。 在客户端,我有VisualStudio生成的域服务和代理对象,用于Silverlight程序集

我想向模型中添加自定义属性(最好是在服务器端)。 假设我有
联系人
公司
地址
表,这些表由外键链接(但不一定是实际的外键约束)。我想添加一个属性,该属性将返回
联系人的
公司的
地址的
对象

我一直试图通过创建一个分部类来扩展
Contact
类,并添加一个
CompanyAddress{get;}
属性来实现这一点。但是我不知道我需要对新属性做什么才能使它传播到客户端自动生成的代码。是否有我必须添加到属性的特定属性?我必须在某个地方注册它,以便代码生成器知道它吗

这必须是一个导航属性,还是更简单的属性


这是做事情的最好方法吗?还是我应该放弃扩展服务器端模型,而只在客户端进行扩展?(如果我在客户端这样做,我将面临无法访问单个
实体
-派生类中的上下文对象的问题。)

我从未使用过Silverlight或RIA服务,但我想这将非常类似。当您创建EF模型,并且您拥有通过外键关联的实体(必须存在关联)时,与其他实体关联的每个实体将包含称为导航属性的内容。所以在您的场景中,联系人应该包含名为Company的属性,Company应该包含名为Address的属性。您可以通过在ObjectSet上使用Include或通过延迟加载(在WCF中这不是一个好主意),使用isntruct EF加载这些导航属性。如果您通过WCF向客户发送联系人,则还会发送公司和地址


你的方法有一个大问题。您的属性仅包含getter-此类属性未序列化。

我从未使用过Silverlight或RIA服务,但我猜它将非常类似。当您创建EF模型,并且您拥有通过外键关联的实体(必须存在关联)时,与其他实体关联的每个实体将包含称为导航属性的内容。所以在您的场景中,联系人应该包含名为Company的属性,Company应该包含名为Address的属性。您可以通过在ObjectSet上使用Include或通过延迟加载(在WCF中这不是一个好主意),使用isntruct EF加载这些导航属性。如果您通过WCF向客户发送联系人,则还会发送公司和地址


你的方法有一个大问题。您的属性仅包含getter-此类属性未序列化。

我当前无法修改现有数据库架构,因此无法依赖生成的.edmx文件中已存在的外键关系。我也不能手动修改.edmx文件,因为架构将来可能会更改,并且当我们重新生成edmx文件时,我的修改将被覆盖。然后将setter添加到属性中,并检查生成的实体类是否标记为DataContract属性。如果是,请使用DataMember属性标记您的属性。感谢您迄今为止的帮助。我添加了一个setter并用[DataMember]标记了该属性。这没有效果;该属性未添加到生成的\u Code\*.Web.g.csCheck中的Contact proxy类中这篇文章:目前我不明白为什么它在您的情况下不起作用。我目前无法修改现有的数据库架构,因此我无法依赖生成的.edmx文件中已经存在的外键关系。我也不能手动修改.edmx文件,因为架构将来可能会更改,并且当我们重新生成edmx文件时,我的修改将被覆盖。然后将setter添加到属性中,并检查生成的实体类是否标记为DataContract属性。如果是,请使用DataMember属性标记您的属性。感谢您迄今为止的帮助。我添加了一个setter并用[DataMember]标记了该属性。这没有效果;该属性没有添加到生成的\u Code\*.Web.g.csCheck这篇文章中的联系人代理类中:目前我不明白为什么它在您的案例中不起作用。