У меня есть проблема с таблицами, которые имеют внешние ключи к другим таблицам в другой схеме.
Например, TableA в SchemaA имеет внешний ключ к TableB в SchemaB. Когда CTP4 создает базу данных, вместо того, чтобы создать внешний ключ от TA до ТБ, это создает третью таблицу "TableA_TableB" со столбцами TableA_ID и TableB_ID, как будто это думает, что должны быть многие многим отношения.
public class TableA
{
public int ID { get; set; }
public TableB TableB { get; set; }
}
public class TableB
{
public int ID { get; set; }
}
var builder = new ModelBuilder();
// this works fine - creates only two tables with the correct foreign key
// builder.Entity<TableA>();
// builder.Entity<TableB>();
// this doesn't work - creates a third many-to-many table
builder.Entity<TableA>().MapSingleType()
.ToTable( new StoreTableName( "TableA", "SchemaA" ) );
builder.Entity<TableB>().MapSingleType()
.ToTable( new StoreTableName( "TableB", "SchemaB" ) );
var model = builder.CreateModel();
var store = new DbContext( "database", model );
store.Database.DeleteIfExists();
store.Database.Create();
Если я удаляю.ToTable.. из вышеупомянутого кода это составляет таблицы правильно.
Я пытался искать решение, но ничего не мог найти. Какая-либо идея, что я делаю неправильно, или действительно ли это - ошибка?
Оказалось, что это ошибка в CTP4, опубликованный вами код должен работать так, как вы ожидали. На данный момент временным решением является явное отображение столбцов в таблице A:
builder.Entity<TableA>().MapSingleType(a => new { a.ID, tableBID = a.TableB.ID })
.ToTable(new StoreTableName("TableA", "SchemaA"));
~ Rowan
Можете ли вы попробовать следующее:
builder.Entity<TableA>().HasKey(t => t.ID);
builder.Entity<TableA>().HasRequired(tA => tA.TableB);
builder.Entity<TableB>().HasKey(t => t.ID);