Ответ 1
Вам нужно спуститься до свободного API для достижения желаемой схемы (аннотации данных не будут делать этого). Точно вы имеете Independent One-to-Many Self Reference Association
, который также имеет собственное имя для столбца внешнего ключа (People.Parent). Вот как это должно быть сделано с EF Code First:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasOptional(p => p.Parent)
.WithMany(p => p.Children)
.IsIndependent()
.Map(m => m.MapKey(p => p.Id, "ParentID"));
}
Однако это вызывает InvalidOperationException
с этим сообщением. Sequence содержит более одного соответствующего элемента. который звучит как ошибка CTP5 в соответствии со ссылкой Стивена, упомянутой в его ответе.
Вы можете использовать обходной путь до тех пор, пока эта ошибка не будет исправлена в RTM, и это должно принять имя по умолчанию для столбца FK, которое равно PersonID
. Для этого вам нужно немного изменить схему:
CREATE TABLE [dbo].[People]
(
Id uniqueidentifier not null primary key rowguidcol,
Name nvarchar(50) not null,
PersonId uniqueidentifier null
)
ALTER TABLE [dbo].[People] ADD CONSTRAINT [ParentOfPerson]
FOREIGN KEY (PersonId) REFERENCES People (Id)
GO
ALTER TABLE [dbo].[People] CHECK CONSTRAINT [ParentOfPerson]
GO
И тогда использование этого свободного API будет соответствовать вашей модели данных для схемы БД:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasOptional(p => p.Parent)
.WithMany(p => p.Children)
.IsIndependent();
}
Добавить новую родительскую запись, содержащую ребенка:
using (FamilyContext context = new FamilyContext())
{
var pebbles = new Person
{
Id = Guid.NewGuid(),
Name = "Pebbles",
};
var fred = new Person
{
Id = Guid.NewGuid(),
Name = "Fred",
Children = new List<Person>()
{
pebbles
}
};
context.People.Add(fred);
context.SaveChanges();
}
Добавьте новую дочернюю запись, содержащую родителя:
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(pebbles);
var rowCount = context.SaveChanges();
}
Оба кода имеют тот же эффект, что и добавление нового родителя (Fred) с дочерним элементом (Pebbles).