2012-05-05 108 views
3

下面的实施例的一对一的关系单向一对一的关系抛出异常在实体框架

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代码第一次承认这是一个1:1的关联,因此可以让您拥有用户和地址之间的双向关联。

现在,您只需在UserId列上定义一个唯一键约束,以使您的关系在数据库端成为一对一。这样做的一种方法是使用已在自定义初始化类被覆盖种子方法:

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

@Floodblood“Address”的PK也应该是FK到'User'表PK。 – Eranga

+0

我无法理解我必须做什么 – Freshblood