При использовании CTP 5 библиотеки 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; }
}
У меня есть настройка строки подключения в приложении.Конфигурационный файл выглядит так:
<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 / designer --- но, похоже, нет четкого документа о том, что такое конвенция.(Мы просто поверили в понятие имен таблиц во множественном числе, для имен классов в единственном числе)
Было бы полезно получить некоторые рекомендации о том, как заставить этот очень простой пример встать на свои места.
ОБНОВЛЕНИЕ: Изменение имени столбца в таблице People с Parent на PersonId позволяет добавить fred
для продолжения.Однако вы заметите, что pebbles
- это добавленная в коллекцию Children fred
, и поэтому я ожидал, что камешки будут добавлены и в базу данных при добавлении Фреда, но это не так.Это очень простая модель, поэтому я более чем обескуражен тем, что для получения пары строк в базе данных необходимо провести много догадок.