У меня есть служба 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 и т. Д.)
Спасибо.