При использовании CTP 5 библиотеки Code-first Entity Framework (как было объявлено здесь) Я пытаюсь создать класс, который сопоставляется с очень простой иерархической таблицей.
Вот SQL, который строит таблицу:
CREATE TABLE [dbo].[People]
(
Id uniqueidentifier not null primary key rowguidcol,
Name nvarchar(50) not null,
Parent uniqueidentifier null
)
ALTER TABLE [dbo].[People]
ADD CONSTRAINT [ParentOfPerson]
FOREIGN KEY (Parent)
REFERENCES People (Id)
Вот код, который я надеюсь автоматически сопоставить с этой таблицей:
class Person
{
public Guid Id { get; set; }
public String Name { get; set; }
public virtual Person Parent { get; set; }
public virtual ICollection<Person> Children { get; set; }
}
class FamilyContext : DbContext
{
public DbSet<Person> People { get; set; }
}
У меня есть настройка строки подключения в файле app.config следующим образом:
<configuration>
<connectionStrings>
<add name="FamilyContext" connectionString="server=(local); database=CodeFirstTrial; trusted_connection=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
И, наконец, я пытаюсь использовать класс для добавления родительской и дочерней сущности следующим образом:
static void Main(string[] args)
{
using (FamilyContext context = new FamilyContext())
{
var fred = new Person
{
Id = Guid.NewGuid(),
Name = "Fred"
};
var pebbles = new Person
{
Id = Guid.NewGuid(),
Name = "Pebbles",
Parent = fred
};
context.People.Add(fred);
var rowCount = context.SaveChanges();
Console.WriteLine("rows added: {0}", rowCount);
var population = from p in context.People select new { p.Name };
foreach (var person in population)
Console.WriteLine(person);
}
}
Здесь явно чего-то не хватает. Исключение, которое я получаю, это:
Недопустимое имя столбца "PersonId".
Я понимаю ценность соглашения по сравнению с конфигурацией, и моя команда и я в восторге от перспективы избавиться от кошмара edmx / дизайнера --- но, похоже, нет четкого документа о том, что такое соглашение. (Нам просто повезло с понятием имен таблиц во множественном числе для имен классов в единственном числе)
Буду признателен за некоторые рекомендации о том, как сделать этот очень простой пример уместным.
ОБНОВЛЕНИЕ: изменение имени столбца в таблице People с Parent на PersonId позволяет продолжить добавление fred
. Однако вы заметите, что pebbles
добавлено в коллекцию Children fred
, поэтому я ожидал, что камешки также будут добавлены в базу данных, когда был добавлен Фред, но этого не произошло. Это очень простая модель, поэтому я более чем обескуражен тем, что для ввода пары строк в базу данных требуется столько догадок.