【问题标题】:Mapping entities with fluent api on entity framework 5在实体框架5上使用流利的api映射实体
【发布时间】:2012-11-03 17:52:12
【问题描述】:

我有一个问题。

我有这两张桌子:

主表是具有客户依赖关系的用户。

逆向工程代码首先生成的类如下:

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

这对吗? 如果没有,这个映射会如何?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    不,不正确。

    你能做的最好的事情——假设你可以改变数据库模式——从Customer表中删除UserID外键,然后在数据库中创建两个主键之间的关系,以便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);
    

    如果您无法更改数据库架构,最好的办法是仅从 User 类中删除集合 ICollection&lt;Customer&gt; Customers 并将关系保持为一对多。

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

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

    【讨论】:

    • 嗨@Slauma,我不明白为什么要删除客户表的外键。我在这个例子中所做的是他的第二个选择。
    • @Gus:不,这不是他的第二选择。他的第二个选项(“一对一外键关联”)使用WithMany(),而不是WithOptional。这是与已删除集合的一对多关系,即只有一个导航属性。此外,如果您有一个名为UserID 的属性,则不能使用MapKey("UserID")。然后你必须使用HasForeignKey,就像 Mortezza 的例子中所示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多