2014-01-13 153 views
4

我发现的大多数问题都不是我正在寻找的类型。实体框架两端可选1对1关系

我有2个表:

public class User 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid UserId { get; set; } 

    public Guid? CustomerId { get; set; } 

    [ForeignKey("CustomerId")] 
    public Customer Customer { get; set; } 
} 

public class Customer 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid CustomerId { get; set; } 

    public Guid? UserId { get; set; } 

    [ForeignKey("UserId")] 
    public User User { get; set; } 
} 

User罐存在而不被一个CustomerCustomer而不一个User可以存在。

我试过这样流畅的API:

modelBuilder.Entity<Customer>() 
    .HasOptional<User>(c => c.User) 
    .WithOptionalDependent(c => c.Customer) 
    .Map(c => c.MapKey("UserId")); 

但它不断给我这个错误,当我尝试创建迁移:

Customer_User_Source: : Multiplicity is not valid in Role 'Customer_User_Source' in relationship 'Customer_User'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.

更新

我将我的模型更改为:

public class User 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid UserId { get; set; } 

    public virtual Customer Customer { get; set; } 
} 

public class Customer 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid CustomerId { get; set; } 

    public virtual User User { get; set; } 
} 

随着流利的API:

modelBuilder 
    .Entity<Customer>() 
    .HasOptional(l => l.User) 
    .WithOptionalPrincipal() 
    .Map(k => k.MapKey("CustomerId")); 

modelBuilder 
    .Entity<User>() 
    .HasOptional(c => c.Customer) 
    .WithOptionalPrincipal() 
    .Map(k => k.MapKey("UserId")); 

这似乎是工作,但有没有办法来定义的,而不必使用MapKey在模型中的列?

回答

2

link 1

而且link 2

与链接的问题是我不知道,如果他们提供了一个实际的解决问题的办法:因为我不知道这是否为提供唯一性两个表中都有外键(正如link建议的那样)。因为没有EF独特的限制,你必须手动创建它(在生成器中)

最后link解释执行1:*关系的唯一形式是使用其中一个表的外键作为另一个主键。

祝你好运。

+1

感谢第二个链接指出我正确的方向,你也许有我的编辑答案? – YesMan85

+0

您是否看到编辑过的答案? – rlartiga

+0

我读过呀。我认为这是EF实施的罪魁祸首。我首先创建了表模型,然后从中生成代码。 EF实际上使它成为1 .. *关系而不是1..1关系。 – YesMan85