我有两个实体
BusinessUser { Id(PK), Name,...}
Login { BusinessUserID(PK, FK), Email, Password, etc...}
BusinessUser
与Login
之间的关系为一对一/一。
我正在进行以下配置 在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; }
}
我也在寻找双向的。
答案 0 :(得分:6)
您的BusinessUser必须将关系配置为:
this.HasOptional(bu => bu.LoginInfo)
.WithRequired(l => l.BusinessUser);
两个配置必须相同(实际上只需要一个)并且第一个配置不正确,因为它试图定义0..1 - 0..1关系。
答案 1 :(得分:1)
你是如何构建课程的?这是一个定义为一对一/零关系的样本。 结果是:
登录{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();
}
}