Asp.net Динамические данные 4 Один-к-одному ForeignKey.ascx Возвращение первичного ключа - PullRequest
0 голосов
/ 21 июля 2011

У меня есть сайт Dynamic Data 4, использующий LinqToSql (.dbml) для 2 таблиц с отношением один к одному. Одна таблица (дочерняя) не всегда имеет строку, соответствующую основной таблице.

В каждом случае (без строки дочерней таблицы) вместо пустой ячейки строки шаблон поля DD ForeignKey.ascx отображает ссылку на:

Childtable/Detail.aspx?ChildPkField=PRIMARYTABLEGUID

Я не могу найти какую-либо комбинацию настроек F-клавиш SQL и / или параметров свойств столбца .dbml, которые бы препятствовали этому. Пока единственным решением является пользовательский шаблон ForeignKey.ascx с

 protected string GetDisplayString()
    {
        object value = FieldValue;
        if (value == null)
        {
            //replace this
            //return FormatFieldValue(ForeignKeyColumn.GetForeignKeyString(Row));
            //with this
            return "";
        }
        else
        {
            return FormatFieldValue(ForeignKeyColumn.ParentTable.GetDisplayString(value));
        }
    }

Очевидно, не оптимальное решение. Для упрощения я удалил все пользовательские метаданные для обеих таблиц и всех других связей, в которых были задействованы таблицы. Без изменений.

Я уверен, что это что-то простое, но я смотрю на это слишком долго - любая помощь приветствуется!

Вот текущие сценарии создания таблиц из Sql Manager:

CREATE TABLE [dbo].[UserProfile](
[UserId] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
[ProfileUserName] [nvarchar](50) NOT NULL,
      CONSTRAINT [PK_Profile] PRIMARY KEY CLUSTERED ([UserId] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
 GO
 ALTER TABLE [dbo].[UserProfile] ADD  CONSTRAINT [DF_Profile_UserID]  DEFAULT (newid()) FOR [UserId]
GO

и

CREATE TABLE [dbo].[SubscribedUser](
[subUserId] [uniqueidentifier] NOT NULL,
[subExpireDate] [date] NULL,
     CONSTRAINT [PK_SubscribedUsers] PRIMARY KEY CLUSTERED ([subUserId] ASC) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]
 GO
ALTER TABLE [dbo].[SubscribedUser]  WITH CHECK ADD  CONSTRAINT [FK_SubscribedUser_UserProfile] FOREIGN KEY([subUserId]) REFERENCES [dbo].[UserProfile] ([UserId])
GO
ALTER TABLE [dbo].[SubscribedUser] CHECK CONSTRAINT [FK_SubscribedUser_UserProfile]
GO

Ответы [ 2 ]

2 голосов
/ 25 июля 2011

Фактически, первый использованный вами метод, возможно, является наиболее оптимальным решением, поскольку на стороне сервера уже был сделан запрос, чтобы определить, соответствуют ли данные столбца взаимосвязи внешнего ключа. Больше никаких запросов не требуется, просто проверьте FieldValue == null. Кроме того, элементы управления шаблонами должны быть отредактированы, поэтому они не компилируются в сборки:

protected string GetDisplayString()
{
    object value = FieldValue;
    if (value == null)
    {
        //replace this
        //return FormatFieldValue(ForeignKeyColumn.GetForeignKeyString(Row));
        //with this
        return "";
    }
    else
    {
        return FormatFieldValue(ForeignKeyColumn.ParentTable.GetDisplayString(value));
    }
}

Однако, если вы намереваетесь сохранить значение исходного поля, используйте этот метод:

protected string GetNavigateUrl()
{
    //replace this
    //if (!AllowNavigation)
    //with this
    if (!AllowNavigation || FieldValue == null)
    {
        return null;
    }
    if (String.IsNullOrEmpty(NavigateUrl))
    {
        return ForeignKeyPath;
    }
    else
    {
        return BuildForeignKeyPath(NavigateUrl);
    }
}

При определенных условиях (включая стили CSS по умолчанию) будет создано поле с гиперссылкой, по которому нельзя щелкнуть. Вы можете использовать jQuery для фильтрации и удаления этих ложных гиперссылок, установив их outerHTML в качестве innerHTML (сценарии на стороне клиента). Конечно, есть более элегантные методы, такие как добавление <asp:label> в ForeignKey.ascx и переключение на этот элемент управления при необходимости.

Примечание: этот метод работает при использовании ADO.NET Entity Data Model. Я не пробовал это на LinqToSqlClasses.

0 голосов
/ 22 июля 2011

Вы пытались удалить обе таблицы из класса linq2sql, а затем снова их перечитать? Может быть, снова воссоздать отношение в схеме еще до этого?

F.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...