实体框架生成的代码链接Silverlight项目不包括函数导入

时间:2014-03-28 21:02:33

标签: entity-framework silverlight silverlight-4.0 wcf-ria-services

  1. 我正在尝试使用以下架构的Silverlight MVVM(使用MEF)应用程序:我有一个n层Silverlight解决方案。其中一个项目是一个包含我的实体数据模型对象的.NET项目。我们将此项目称为MySqlData

  2. 我成功地从现有数据库生成代码。

  3. 从MySQLData EDMX模型浏览器中,我使用函数import添加了一个存储过程,该函数也创建了一个复杂的类型。

  4. 我将代码生成项添加到项目中,最终得到MySqlData.tt和MySqlData.Context.tt

  5. 单击“运行自定义工具”后,我的新函数导入和复杂类型成功出现在MySqlData.tt和MySqlData.Context.tt中。(我很高兴!)

  6. 我还将WCF RIA域服务类添加到MySqlData项目,因为我正在使用Silverlight应用程序。

  7. 在同一解决方案下,我转到名为MyInfrastructure的Silverlight项目,然后单击属性。在Silverlight Build Options下的WCF RIA Service Link选项中,我选择了MySqlData项目。

  8. 当我构建MyInfrastructure项目时,我可以看到生成的类MySqlData.g.cs。

  9. 现在问题(感谢您的耐心等待):生成的代码MySqlData.g.cs没有任何对我的新功能导入和新功能的引用在MySqlData项目中创建的类型。事实上,Domain Service类没有显示对新复杂类型的任何引用,因此它不会为MyInfrastructure项目生成预期的代码。我尝试了除复杂类型之外的其他东西,比如说只返回一个字符串的存储过程。仍然没有好处。我也试过创建一个部分DomainService类,也没有好结果。

  10. 我该怎么做才能强制函数导入等显示在另一个项目中生成的代码上。我希望不必采用手动干预来实现这些目的,否则每次通过自定义工具重新生成代码时我都必须手动执行某些操作。

  11. 我正在使用Visual Studio 2010和Entity Framework 4.3.1

    感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法:

首先,没有必要使用模板文本来生成.tt文件,因为生成的代码是在我在Silverlight类库中创建WCF RIA服务引用时创建的。就我的例子而言,它被称为MyInfrastructure。

为确保生成的代码显示我的新存储过程和我创建的复杂类型,我必须创建一个包含以下内容的部分Domain Services类:

namespace MySqlData
{
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.ServiceModel.DomainServices.EntityFramework;


    public partial class MySqlDataDomainService : LinqToEntitiesDomainService<MySqlDataEntities>
    {

        [System.ServiceModel.DomainServices.Server.Query]
        public IQueryable<JournalViewItem> GetJournalViewItems()
        {
            return this.ObjectContext.GetJournalViewItems().AsQueryable();
        }

    }

    [MetadataType(typeof(JournalViewItemMetadata))]
    public partial class JournalViewItem
    {

        internal sealed class JournalViewItemMetadata
        {
            public JournalViewItemMetadata() { }

            [Key]
            public int JournalItemId { get; set; }
        }
    }


}

有两件重要的事情帮助了我:

我必须将此注释添加到函数import:

[System.ServiceModel.DomainServices.Server.Query]

我还必须在下面创建代码,用JournalViewItem复杂类型解决与缺失密钥相关的错误:

[MetadataType(typeof(JournalViewItemMetadata))]
    public partial class JournalViewItem
    {

        internal sealed class JournalViewItemMetadata
        {
            public JournalViewItemMetadata() { }

            [Key]
            public int JournalItemId { get; set; }
        }
    }

我希望这可以帮助别人。