【问题标题】:Entity Framework code first optional ICollection relationship实体框架代码第一个可选的ICollection关系
【发布时间】:2015-11-12 22:22:32
【问题描述】:

我是代码优先实体框架的新手,并试图解决可选关系。

我有以下型号

public class Customer
{
    public int Id { get; set; }
    public int? CardId { get; set; }    
    public virtual ICollection<Card> Cards { get; set; }
    .......
}

public class Card
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CustomerId { get; set; }
    public virtual Customer Customer { get; set; }
    .......

}

客户可能没有任何卡,因此关系需要是可选的,卡必须有客户。

我已尝试以下方法,但该集合不包含客户的定义。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //modelBuilder.Entity<Customer>()
    //.HasOptional(lu => lu.Cards)
    //.WithRequired(pi => pi.Customer);
}

谁能指出我正确的方向?

更新了代码以反映以下建议,不幸的是仍然没有运气。

【问题讨论】:

  • ICollection&lt;Card&gt; Cards 应定义为virtual
  • 是的尝试过,添加到上面的代码示例中。问题是在集合上设置 1-many-null 关系。

标签: entity-framework


【解决方案1】:

看起来你想要做的只是创建一个一对多的关系。

在您的卡片模型中,您需要包括:

public int CustomerId { get; set; }  // Setting up a foreign key.

使用此设置,Customer 类将不需要:

public int? CardId { get; set; } // not necessary anymore

对于一对多关系,ICollection&lt;Card&gt; Cards 自动允许允许 0 个项目。默认情况下,您不必构建该集合。想想任何收藏。您不必将任何项目添加到该集合中即可存在。您还可以添加许多项目,然后再将它们带走,这没关系。

【讨论】:

  • 谢谢我试过了,这里的一些例子建议删除虚拟,但我现在把它放回去了。我仍然在 WithRequired 上收到错误,我似乎无法将其映射到客户?
  • 我看到你添加了虚拟。您是否还添加了外键? CustomerId 和 CardId?这些是我上面推荐的 int 属性。
  • 是的,感谢您的建议。尝试过并从 OnModelCreating 中删除代码,但是 Customer 和 Card 之间的关系是根据需要创建的,而不是可选的。
  • 更新了上面的代码,也许我看错了,不可能与集合创建多 0 关系?
  • 我明白你现在在做什么。好的,您的 Customer 模型中不需要 CardId。默认情况下,您的 Customer 类中的 Cards 应该是可选的。你可以有 0 或者你可以有 300,这应该没关系。您是否遇到任何错误或问题让您认为这不起作用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
相关资源
最近更新 更多