实体框架首先是一对多关系代码

rid*_*orm 3 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;
}
Run Code Online (Sandbox Code Playgroud)

当我这样离开时,生成数据库时出错 - 表中的键丢失了.我想通过将键的名称更改为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");
    }
}
Run Code Online (Sandbox Code Playgroud)

数据库中表之间的关系加倍.使用代码优先方法进行一对多关系的正确方法是什么?我在思考方向还是错误的做法?

编辑

好吧,我已经按照@Eranga的方式完成了,但仍然存在问题.当我从数据库获取Client时,其Orders属性为null(但在数据库中,它有一些Order.ClientID == Client.ClientID的订单).

Era*_*nga 6

您需要映射参与关系的两个属性.您需要将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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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