entity-framework - Entity Framework 一对多关系代码优先

标签 entity-framework one-to-many relationship

我正在迈出 EF 4.1 的第一步。因为我使用的是 NHibenate,代码优先方法在我看来是最好的方法。我对一对多(或多对一)关系的良好映射有疑问。假设我有 2 个实体:

class ClientModel
{
    int ClientID;
    string Name;
    virtual IList<OrderModel> Orders;
}

class OrderModel
{
    int OrderID;
    string Details;
    virtual ClienModel Client;
}

当我这样离开时,生成数据库时出现错误 - 表中的键丢失。我发现我可以通过将键的名称更改为 ID(但它不符合我的命名约定)或通过添加 [Key] 注释来修复它。即使我添加了这个注释,表的名称仍然是错误的——就像类名一样,但带有“s”。 所以我尝试使用流畅的 API - 我做了映射。但是如果我像这里一样设置映射:

class ClientMapping
{
    ClientMapping()
    {
        this.HasKey(e => e.ClientID).Property(e => e.ID).HasColumnName("ClientID");
        this.Property(e => e.Name).HasColumnName("Name");
        this.HasMany(e => e.Orders).WithOptional().Map(p => p.MapKey("OrderID")).WillCascadeOnDelete();
        this.ToTable("Clients");
    }
}

class OrderMapping
{
    OrderMapping()
    {
        this.HasKey(e => e.OrderID).Property(e => e.OrderID).HasColumnName("OrderID");
        this.Property(e => e.Details).HasColumnName("Details");
        this.HasRequired(e => e.Client).WithMany().Map(p=>p.MapKey("Client")).WillCascadeOnDelete(false);
        this.ToTable("Orders");
    }
}

数据库中表之间的关系加倍。 使用代码优先方法建立一对多关系的正确方法是什么?我的想法是正确的还是错误的方法?

编辑

OK,我已经按照@Eranga展示的方式做了,但是还是有问题。当我从数据库中获取 Client 时,它的 Orders 属性为空(但在数据库中它有一些 Order.ClientID == Client.ClientID 的订单)。

最佳答案

您需要映射参与关系的两个属性。您需要将 ClientID 列添加到 Orders 表。

class ClientMapping
{
    ClientMapping()
    {
        this.HasKey(e => e.ClientID).Property(e => e.ID).HasColumnName("ClientID");
        this.Property(e => e.Name).HasColumnName("Name");

        this.HasMany(e => e.Orders).WithRequired(o => o.Client)
           .Map(p => p.MapKey("ClientID")).WillCascadeOnDelete();

        this.ToTable("Clients");
    }
}

class OrderMapping
{
    OrderMapping()
    {
        this.HasKey(e => e.OrderID).Property(e => e.OrderID).HasColumnName("OrderID");
        this.Property(e => e.Details).HasColumnName("Details");
        this.ToTable("Orders");
    }
}

从一个实体配置关系就足够了。

关于entity-framework - Entity Framework 一对多关系代码优先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7500747/

相关文章:

php - Laravel 多个 withCount 在同一个关系上

c# - 插入时的自引用主键

c# - 包括属性(property)但排除该属性(property)的属性(property)之一

laravel - Laravel 背包 4.1 中的多对多关系

powershell - Powershell开关一对多关联

grails - 如何防止Grails在删除父级时不删除子级?

php - 关系中的 Laravel 命名空间让我感到困惑

c# - 连接表是否隐式隐藏在 Entity Framework 图中?

c# - 从大型数据库中检索行时优化灵活的 Linq to Entity 标准的性能

c# Dapper,SplitOn : multiple same parameter issue Multi-mapping one-to-many