2012-05-05 2 views
3

Ниже пример один-к-одному бросает исключениеоднонаправленный один-к-одному в Entity Framework

public class User 
{ 
    public int Id { get; set; } 
    public Address Address { get; set; } 
} 

public class Address 
{ 
    public int Id { get; set; } 
    public User User { get; set; } 
} 

Исключение говорит:

Невозможно определить основной конец ассоциации между типами «ConsoleApplication1.Address» и «ConsoleApplication1.User». . Основной конец этой ассоциации должен быть явно сконфигурирован , используя либо свободно распространяемый API, либо аннотации данных.

это работает, если я удаляю свойство пользователя из Адрес, но я не хочу.

Как я могу получить такие отношения без исключения?

ответ

13

Хотя ответ предоставляется Eranga правильно и создает shared primary key association между Пользователем и адресом, вы не можете использовать его из-за ограничения, этот тип отображения имеет.

Вот еще один способ создания 1: 1 ассоциация, которая называется one-to-one foreign key association:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Address>() 
       .HasRequired(a => a.User) 
       .WithOptional(u => u.Address) 
       .Map(m => m.MapKey("UserId")); 
} 

EF Code First признает это как 1: 1 ассоциацию, следовательно, позволяет иметь двунаправленную связь между пользователем и адресом ,

Теперь все, что вам нужно сделать, это определить ограничение уникального ключа в столбце UserId, чтобы ваши отношения были истинными один на один со стороны вашей базы данных. Один из способов сделать это является использование метода Seed, который был переопределен в классе пользовательских инициализатора:

class DbInitializer : DropCreateDatabaseAlways<Context> 
{ 
    protected override void Seed(Context context) 
    { 
     context.Database.ExecuteSqlCommand("ALTER TABLE Addresses ADD CONSTRAINT uc_User UNIQUE(UserId)"); 
    } 
} 


Приведенный выше код приведет к следующей схеме:

enter image description here

3

Вам необходимо использовать свободный API для сопоставления отношений как общего первичного ключа.

public class MyContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Address>() 
      .HasRequired(a => a.User) 
      .WithOptional(u => u.Address); 
    } 
} 
+0

У меня есть точно сделал то, что вы сказали, и dbcontext создал базу данных без каких-либо проблем. Но когда я проверяю таблицы, я вижу, что между пользовательскими и адресными таблицами нет никакой связи. huhhh – Freshblood

+0

@Freshblood PK 'Address' также должен быть FK в таблице« Пользователь »PK. – Eranga

+0

Я не мог понять, что мне нужно сделать – Freshblood