При использовании 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; }
}
У меня есть установка connectionstring в файле 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/designer --- но, похоже, нет четкого документа о том, что такое конвенция. (Нам просто повезло в понятие множественных имен таблиц, для уникальных имен классов)
Было бы полезно оценить некоторые рекомендации о том, как сделать этот очень простой пример.
UPDATE:
Изменение имени столбца в таблице "Люди" с "Родитель" на "Личный" позволяет выполнить добавление fred
. Howerver, вы заметите, что pebbles
добавлен в коллекцию Children fred
, и поэтому я бы ожидал добавления гальки в базу данных, когда был добавлен Fred, но это было не так. Это очень простая модель, поэтому я более чем обескуражен тем, что должна быть эта многообещающая работа, связанная с получением пары строк в базе данных.