2012-11-03 106 views
0

我有一个问题。在实体框架上使用流畅的api映射实体5

我有这两个表: Tables

主要表是用户与顾客的依赖。

反向工程师第一代码生成的类如下:

public class User 
{ 
    public User() 
    { 
     this.Customers = new List<Customer>();   
    } 

    ... 

    public virtual ICollection<Customer> Customers { get; set; } 

} 

public class Customer 
{ 
    public Customer() 
    { 
    } 

    ... 

    public int UserID { get; set; } 
    public virtual User User { get; set; } 

} 

我发在用户类以下修改:

public class User 
{ 
    public User() 
    {   

    } 
    public int CustomerID { get; set; } 
    public virtual Customer Customer { get; set; } 

} 

由于关系是1对零或 - 一。

原来的映射是这样的:

// Relationships 
     this.HasRequired(t => t.User) 
      .WithMany(t => t.Customers) 
      .HasForeignKey(d => d.UserID); 

而且修改后的映射是这样的:

this.HasRequired(t => t.User) 
      .WithOptional(t => t.Customer) 
      .Map(m => m.MapKey("UserID")); 

是正确的? 如果不是,这个映射将如何?

谢谢。

回答

2

不,这是不正确的。

你能做的最好的事情 - 假设你可以改变数据库模式 - 被去除的CustomerUserID外键,然后创建在两个主键之间的数据库中的关系,使Customer.CustomerID是外键该协会。然后

逆向工程会自动创建一个预期对一的关系,像这样:

public class Customer 
{ 
    public int CustomerID { get; set; } 
    public virtual User User { get; set; } 
    //... 
} 

public class User 
{ 
    public int UserID { get; set; } 
    public virtual Customer Customer { get; set; } 
    //... 
} 

//... 

this.HasRequired(t => t.User) 
    .WithOptional(t => t.Customer); 

如果您不能更改数据库模式,最好的办法是只从删除收集ICollection<Customer> CustomersUser类,并保持关系为一对多。

所有这一切的原因是,EF只支持共享主键一对一关联,而不支持外键一对一关联。 (后者只能通过删除集合来“伪造”,但从EF的角度来看它仍然是一对多)。

您可以在此处阅读有关与EF及其局限性的一对一关联的更多信息:

+0

嗨@Slauma,我不明白为什么删除customer表的外键。我在这个例子中做了他的第二个选择。 – Gus

+0

@格斯:不,这不是他的第二选择。他的第二个选择(“一对一外键协会”)使用'WithMany()',而不是'WithOptional'。这是与已移除集合的一对多关系,即只有一个导航属性。另外,如果您有一个名为UserID的属性,则不能使用MapKey(“UserID”)。那么你必须使用'HasForeignKey',就像Mortezza的例子所示。 – Slauma

+0

嗨@Slauma,谢谢你的帮助。 – Gus