实体框架4.1:在“登录”类型上声明的导航属性“BusinessUser”已配置了冲突的多重性

时间:2012-01-07 18:53:37

标签: entity-framework orm ado.net entity-framework-4.1 ef-code-first

我有两个实体

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

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

BusinessUserLogin之间的关系为一对一/一

我正在进行以下配置 在BusinessUser EF配置类

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

在登录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 个答案:

答案 0 :(得分:6)

您的BusinessUser必须将关系配置为:

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

两个配置必须相同(实际上只需要一个)并且第一个配置不正确,因为它试图定义0..1 - 0..1关系。

答案 1 :(得分:1)

你是如何构建课程的?这是一个定义为一对一/零关系的样本。 结果是:

  • BusinessUser {Id(PK),Name,...}
  • 登录{BusinessUserID(PK,FK),电子邮件,密码等...}

    
    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; }
    } 

    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和Initializer

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();
    }
}