Можно ли динамически заполнять реляционные данные, используя один столбец внешнего ключа, который отображается в две разные таблицы в ef 4.1? - PullRequest
0 голосов
/ 12 ноября 2011

У меня есть служба ac # .net 4 wcf ria, работающая с клиентом silverlight 4, в первую очередь использующая код linq to ef.

DbContext:

public class TableA
{
    public long TableAId {get; set;}
    public string LinkedTableType {get; set;}
    public long LinkedTableId {get; set;}

    public virtual TableB TableB { get; set; }
    public virtual TableC TableC { get; set; }
}

public class TableB
{
    public long TableBId {get; set;}
    public string TableB_1 {get; set;}

    public long ChildTableAId {get; set;}
    [ForeignKey("ChildTableAId")]
    public virtual TableA TableA {get; set;}
}

public class TableC
{
    public long TableCId {get; set;}
    public string TableC_1 {get; set;}
    public string TableC_2 {get; set;}
}

TableA.LinkedTableId - это foreginключ, который относится к TableB или TableC с помощью TableBId или TableCId соответственно, в зависимости от значения LinkedTableType.Например, LinkedTableType может быть «B» или «C».

Я прочитал вопрос здесь , но я хочу, чтобы ef циклическая ссылка из TableA -> TableB -> TableA ->TableB.Обратите внимание, что это не может произойти с реальными данными;Если строка в TableA указывает на строку в TableB, строка в TableA, на которую TableB указывает ChildTableAId, никогда не должна указывать обратно на TableB, только на TableC.

Доменная служба:

[MetadataTypeAttribute(typeof(TableA.TableAMetadata))]
public partial class TableA
{
    internal sealed class TableAMetadata
        {
            private TableAMetadata()
            {
            }

            public long TableAId { get; set; }

            [Include]
            public TableB TableB { get; set; }

            [Include]
            public TableC TableC { get; set; }
        }
}

public partial class TableB
{
    internal sealed class TableBMetadata
    {
        private TableBMetadata()
        {
        }

        public long TableBId { get; set; }

        public string TableB_1 { get; set; }

        public long ChildTableAId { get; set; }

        [Include]
        public TableA TableA { get; set; }
    }
}

[EnableClientAccess]
public partial class Sample1DomainService : LinqToEntitiesDomainService<Sample1Entities>
{
    public IQueryable<TableA> GetTableA()
    {
        return this.ObjectContext.TableA
            .Include("TableB");
            .Include("TableC");
    }
}

Я могу скомпилировать доменную службу (Sample1.RIAServices.Web) без ошибок, но библиотека silverlight службы wcf ria (Sample1.RIAServices) завершается ошибкой со следующей ошибкой компилятора:

Связанный тип метаданных длятип 'Sample1.RIAServices.Web.TableA' содержит следующие неизвестные свойства или поля: TableB, TableC.Убедитесь, что имена этих членов совпадают с именами свойств основного типа.

Как мне заполнить TableB или TableC на стороне сервера, чтобы они были непосредственно доступны на wcf riaклиент?Возможно ли это, указав пользовательское реляционное отображение в переопределенном методе OnModelCreating в DbContext и \ или указав пользовательский запрос linq в доменной службе wcf ria?Если да, то как?

Например, это то, что я ожидал бы на стороне клиента:

IEnumerable<TableA> tableA = MyDbContext.TableA;

foreach (TableA _tableA in tableA)
{
    if (_tableA.LinkedTableType == "B")
    {
        Assert.IsNotNull(_tableA.TableB);
        Assert.IsNull(_tableA.TableC);
    }
    else if (_tableA.LinkedTableType == "C")
    {
        Assert.IsNotNull(_tableA.TableC);
        Assert.IsNull(_tableA.TableB);
    }
    else
    {
        Assert.IsNull(_tableA.TableB);
        Assert.IsNull(_tableA.TableC);
    }
}

Я хочу сделать это на стороне сервера для поддержки постраничного просмотра записей в Таблице Aи не нужно загружать всю TableB и TableC, чтобы убедиться, что внешние таблицы существуют.

Если существует лучший дизайн базы данных?Обратите внимание, что в моем реальном дизайне базы данных есть около 10 столбцов в TableB и 6 столбцов в TableC.Столбцы в TableB и TableC не похожи.Я хотел бы сохранить дизайн достаточно гибким, чтобы можно было легко добавить поддержку для более «связанных» таблиц (например, TableD, TableE, TableF и т. Д.)

Спасибо.

1 Ответ

0 голосов
/ 15 ноября 2011

Я на самом деле решил свою проблему, выполнив следующее:
1. удалите LinkedTableId
2. добавьте обнуляемые внешние ключи TableA.TableBId и TableA.TableCId

This postочень помог мне:)

...