在实体框架5上使用流畅的api映射实体

时间:2012-11-03 17:52:13

标签: entity-framework c#-4.0 orm code-first lambda

我有一个问题。

我有这两个表: 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; }

}

因为这种关系是一对一或一对。

原始映射是:

// 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"));

这是对的吗? 如果没有,这个映射怎么样?

感谢。

1 个答案:

答案 0 :(得分:2)

不,这不正确。

您可以做的最好的事情 - 假设您可以更改数据库模式 - 从UserID表中删除Customer外键,然后在数据库中创建两个主键之间的关系,以便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> Customers类中删除集合User,并将关系保持为一对多。

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

您可以在此处详细了解与EF的一对一关联及其限制: