我有一个ASP.NET 4动态数据网站,该网站针对一组相当简单的数据库表运行,通过另一个程序集中的实体框架模型公开。我不想在EF模型中支持所有表格,所以在我的global.asax文件中,我已经初始化了这样的默认模型:
DefaultModel.RegisterContext( typeof( MyCompany.MyProject.DataModel.DataContext ), new ContextConfiguration() { ScaffoldAllTables = false } );
MSDN文档(以及global.asax文件中的注释)说我现在应该能够通过将[ScaffoldTable(true)]
属性添加到其部分“伙伴”类来有选择地启用各个表的脚手架。我这样做了:
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.DynamicData;
namespace MyCompany.MyProject.DataModel
{
[MetadataType( typeof( InHouseClaimMetadata ) )]
[ScaffoldTable( true )]
public partial class InHouseClaim
{
[DisplayName( "In-House Claims" )]
[TableName( "In-House Claims" )]
public class InHouseClaimMetadata
{
[DisplayName( "Reporting Date" )]
public object ReportingDate { get; set; }
// etc etc...
}
}
}
但是在加载Default.aspx时,我收到以下错误消息:
没有可访问的表格。确保至少有一个数据模型 在Global.asax中注册并启用或实现脚手架 自定义页面。
我以前在类似的场景中工作过;这次尝试的另一个不同之处在于我的EF模型是它自己的组件。如果我更改global.asax继续并脚手架所有表,它可以正常工作。但显然,我不希望如此。我小心翼翼地确保部分元数据类的名称空间与EF数据上下文的名称空间匹配。
所以我很难过......
答案 0 :(得分:4)
所以,我是个白痴:这不是EF或动态数据问题,它是C#约束。来自MSDN:
所有部分类型定义必须是相同类型的部分 在同一个程序集和相同的模块中定义(.exe或.dll 文件)。 部分定义不能跨越多个模块。
答案 1 :(得分:1)
我尝试重新创建您的方案,而不是使用属性mappging我已使用以下代码进行测试:
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.DynamicData;
namespace MyCompany.MyProject.DataModel
{
[MetadataType(typeof(InHouseClaimMetadata))]
[ScaffoldTable(true)]
public partial class InHouseClaim
{
public class InHouseClaimMetadata
{
}
}
}
如果EF数据上下文的名称空间与部分类的名称空间匹配,则此方法有效。您是否可以尝试评论您的房产映射以消除这些问题,并了解您是如何离开那里的?
答案 2 :(得分:1)
对我来说有用的是,在解决方案资源管理器中,右键单击包含我的部分类的.cs文件,选择“属性”,然后将“构建操作”设置为“编译”。无论出于何种原因,默认情况下文件的Build Action都设置为Content。 (花了我几个小时来解决这个问题。希望这能节省时间。)