具有自己的MetaData的asp.net动态数据站点

时间:2010-04-20 18:21:53

标签: asp.net linq-to-sql dynamic-data asp.net-dynamic-data

我正在搜索有关在asp.NET动态网站中配置自己的 MetaData 的信息。

例如。我在MS Sql Server中有一个表,其结构如下所示:

CREATE TABLE [dbo].[someTable](
    [id] [int] NOT NULL,
    [pname] [nvarchar](20) NULL,
    [FullName] [nvarchar](50) NULL,
    [age] [int] NULL)

我有2个Ms Ms表(我已创建),sysTables和sysColumns。

SYSTABLES:

ID sysTableName TableName TableDescription

1 | someTable |人员|系统中人员的所有数据

SYSCOLUMNS:

ID TableName sysColumnName ColumnName ColumnDesc ColumnType MUnit

1 | someTable | sometable_pname |名称|角色名称(约翰)| nvarchar(20)|空
2 | someTable | sometable_Fullname |全名|角色名称(例如John Black)| nvarchar(50)|空
3 | someTable | sometable_age |年龄|人年龄| int | null

我希望在 Details / Edit / Insert / List / ListDetails 页面中使用MetaData sysColumns和sysTableData。因为,对于前。在详细信息页面 fullName 中,它不是美丽的 全名

someIdea,有可能吗?

谢谢

更新: 在列表页面中显示来自sysTables(metaData表)的数据我修改了<h2 class="DDSubHeader"><%= tableName%></h2>

public string tableName;
protected void Page_Init(object sender, EventArgs e)
{

            table = DynamicDataRouteHandler.GetRequestMetaTable(Context);
            //added by me
            uqsikDataContext sd=new uqsikDataContext();
            tableName = sd.sysTables.Where(n => n.sysTableName == table.DisplayName).FirstOrDefault().TableName;
            //end

            GridView1.SetMetaTable(table, table.GetColumnValuesFromRoute(Context));
            GridDataSource.EntityTypeName = table.EntityType.AssemblyQualifiedName;
            if (table.EntityType != table.RootEntityType)
            {
                GridQueryExtender.Expressions.Add(new OfTypeExpression(table.EntityType));
            }
 }

那么,sysColums呢?如何从 sysColumns 表中获取数据?

2 个答案:

答案 0 :(得分:0)

总之,是的,这是可能的。但是,我不相信这是个好主意。你真正在谈论的是将演示数据存储在你的数据库中,当真正最好的地方放在你的aspx页面中。话虽这么说,如果您想在数据库中存储数据字典类型信息,我建议您使用内置的内置sys.tablessys.columnssys.types视图MS SQL Server,并添加一个名为ObjectDescriptions的表来存储显示名称和类型。

create table ObjectDescriptions (
   object_id int not null,
   column_id null, --leave this column null if the record describes the table itself
   ObjectDisplayName nvarchar(20),
   ObjectDescription nvarchar(200)
 );

然后,您可以创建基于对象ID的视图来检索表的元数据,并直接绑定或动态填充您的asp.net FormView

create view TableData as     
select 
     t.name as table_name
    ,td.ObjectDisplayName as table_display_name
    ,td.ObjectDescription as table_description
    ,c.name as column_name
    ,cd.ObjectDisplayName as column_display_name
    ,cd.ObjectDescription as column_description
    ,c.column_id
    ,ty.name as [type_name]
    ,c.max_length
    ,c.scale
    ,c.[precision]
from sys.tables t
    left join ObjectDescriptions td on td.object_id = t.object_id
    join sys.columns c on c.object_id = t.object_id
    left join ObjectDescriptions cd on cd.column_id = c.column_id and cd.object_id  = c.object_id
    join sys.types ty on c.user_type_id = ty.user_type_id

编辑:

然后,您可以在ASP代码中利用此视图,方法是编写一个包含有关单个表的元数据的类,并在DAL中编写一个方法,以根据对象或表名检索此类的实例。当您填充页面时,页面可以检索您要查找的记录以及表的元数据,并将该元数据绑定到网格标题(在列表视图中)或单个标签的单个文本框中记录模式。

答案 1 :(得分:0)

我发现有用的article,可用于解决我的问题