Entity Framework 4.1: свойство навигации «BusinessUser», объявленное для типа «Логин», настроено с конфликтующими кратностями - PullRequest
3 голосов
/ 07 января 2012

У меня есть две сущности

BusinessUser { Id(PK), Name,...}

Login { BusinessUserID(PK, FK), Email, Password, etc...}

Отношения между BusinessUser и Login равны один к нулю / один .

У меня естьследующие конфигурации В классе конфигурации BusinessUser EF

this.HasOptional(bu => bu.LoginInfo)
    .WithOptionalPrincipal(l => l.BusinessUser);

В классе конфигурации Login EF

this.HasRequired(l => l.BusinessUser)
    .WithOptional(bu => bu.LoginInfo);

Я получаю следующее исключение

Свойство навигации BusinessUserобъявленный для типа 'Логин' был настроен с конфликтующими кратностями.

Где я ошибаюсь с моей конфигурацией один-к-одному / нулю в коде EF 4.1 сначала.

Обновление 1 : Ниже приведена структура моего класса

public class BusinessUser {
    public virtual int ID { get; set; }

    public virtual int BusinessID { get; set; }

    public virtual Business Business { get; set; }

    public Login LoginInfo { get; set; }
  }

 public class Login {
    public virtual int BusinessUserID { get; set; }

    public virtual string Email { get; set; }

    public virtual string Password { get; set; }

    public BUsinessUser BusinessUserInfo { get; set; }
  }

Также я ищу двунаправленный.

Ответы [ 2 ]

6 голосов
/ 08 января 2012

Ваш BusinessUser должен иметь отношение, настроенное как:

this.HasOptional(bu => bu.LoginInfo)
    .WithRequired(l => l.BusinessUser);

Обе конфигурации должны быть одинаковыми (на самом деле требуется только одна), а первая конфигурация неверна, поскольку пытается определить отношение 0..1 - 0..1.

1 голос
/ 08 января 2012

Как вы структурировали свои занятия? Вот пример с отношением один-к-одному / нулю. Результат:

  • BusinessUser {Id (PK), Name, ...}
  • Логин {BusinessUserID (PK, FK), электронная почта, пароль и т. Д ...}

    <code>
    public class BusinessUser
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public virtual LoginInfo LoginInfo { get; set; }
    } </p>
    
    <p>public class LoginInfo
    {
        public int BusinessUserId { get; set; }
        public virtual BusinessUser BusinessUser { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
    }
    

Вот DbContext и инициализатор

</p>

<pre><code>public class MyContext : DbContext
{

    public DbSet<BusinessUser> BusinessUsers { get; set; }
    public DbSet<LoginInfo> LoginInfos { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        //We define the key for the LoginInfo table
        modelBuilder.Entity<LoginInfo>().HasKey(x => x.BusinessUserId);
        modelBuilder.Entity<LoginInfo>().HasRequired(bu => bu.BusinessUser);
    }
}

public class MyInitializer : DropCreateDatabaseIfModelChanges<MyContext>
{
    protected override void Seed(MyContext context)
    {
        var businessUser = new BusinessUser();
        businessUser.Email = "mymail@email.com";
        businessUser.Name = "My Name";
        businessUser.LoginInfo = new LoginInfo(){Username = "myusername", Password ="mypassword"};
        context.BusinessUsers.Add(businessUser);
        context.SaveChanges();
    }
}

...