При использовании Entity Framework Code First 4.3.1 можно создавать отношения с кратностью 1-к-1. То есть, одна сущность на каждом конце отношений.Entity Framework Code First One-к-одному Required-Required Relationship
Можно настроить 1-на-1 отношения быть требуется, требуется или требуется факультативные ^. Однако, когда я переключаюсь между этими двумя, я не вижу различий в:
- Созданная схема базы данных. Я нацелен на SQL Server 2008.
- Среда выполнения EF.
Таким образом, я могу создать RequiredPrincipalAs запись без соответствующего RequiredDependentAs записи, несмотря на отношения быть сконфигурированы как требуется, требуется. Это, кажется, противоречит документации по HasRequired (...):
конфигурирует необходимую связь от этого типа объекта. Экземпляры типа сущности не могут быть сохранены в базе данных, если это отношение не указано. Внешний ключ в базе данных будет недействительным.
В требуемых- требуется отношения лиц:
public class RequiredPrincipalA
{
public int Id { get; set; }
public virtual RequiredDependentA DependentA { get; set; }
}
public class RequiredDependentA
{
public int Id { get; set; }
public virtual RequiredPrincipalA PrincipalA { get; set; }
}
В требуемых факультативных отношений лица:
public class RequiredPrincipalB
{
public int Id { get; set; }
public virtual OptionalDependentB DependentB { get; set; }
}
public class OptionalDependentB
{
public int Id { get; set; }
public virtual RequiredPrincipalB PrincipalB { get; set; }
}
DbContext и модель конф iguration:
public class AppContext : DbContext
{
public DbSet<RequiredPrincipalA> PrincipalAs { get; set; }
public DbSet<RequiredDependentA> DependentAs { get; set; }
public DbSet<RequiredPrincipalB> PrincipalBs { get; set; }
public DbSet<OptionalDependentB> DependentBs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<RequiredPrincipalA>()
.HasRequired(o => o.DependentA)
.WithRequiredPrincipal(o => o.PrincipalA);
modelBuilder.Entity<RequiredPrincipalB>()
.HasOptional(o => o.DependentB)
.WithRequired(o => o.PrincipalB);
}
}
Тест Код:
Database.SetInitializer(new DropCreateDatabaseAlways<AppContext>());
using (var ctx = new AppContext())
{
ctx.Database.Initialize(force: false);
ctx.PrincipalAs.Add(new RequiredPrincipalA());
ctx.PrincipalBs.Add(new RequiredPrincipalB());
ctx.SaveChanges();
}
Я знаю, я мог бы добавить атрибут данных [обязательно] для навигационных свойств RequiredPrincipalA.DependentA и RequiredDependentA.PrincipalA , Это приведет к тому, что проверка EF позволит предотвратить описанный выше сценарий. Однако я не хочу этого делать, потому что он также проверяет, что свойство навигации заполняется при обновлении существующего объекта. Это означает, что приложение должно предварительно получить объект на другом конце отношения для каждого обновления.
Почему я не вижу никакой разницы в поведении EF только при изменении отношения между требуется, требуется и требуется факультативные?
^Обратите внимание, что по желанию факультативные также поддерживается, но это не является частью моего вопроса. Существуют очевидные различия в сгенерированной схеме базы данных и времени выполнения, когда настраивается необязательно-необязательное отношение.
Благодарим вас за ответ. Это, безусловно, уточняет аспект схемы базы данных моего вопроса. Тем не менее, я очень хочу понять, почему в EF нет каких-либо явных поведенческих изменений. –
Возможно ли, что требуемое-необходимое разрешено, поскольку оно может быть исполнено EF, даже если на самом деле это невозможно для принудительного применения этого ограничения в SQL? –
Люк, факт отсутствия различий в схеме при настройке r/r и r/o теперь понимается благодаря ответу Ладислава. Теперь дело в том, что r/r, похоже, не работает во время исполнения EF, несмотря на то, что заявляет документация. –