【问题标题】:Entity Framework One-to-Many with Default实体框架一对多与默认
【发布时间】:2013-04-02 08:37:17
【问题描述】:

我正在尝试在 Entity Framework 中建立一对多关系,其中许多项目之一被可选地指定为默认值。

public class SomeEntity
{
    public int Id { get; set; }
    public Item DefaultItem { get; set; }          // Optional
    public ICollection<Item> Items { get; set; }
}

public class Item
{
    public int Id { get; set; }
    public string ItemName { get; set; }
    public SomeEntity SomeEntity { get; set; }
}

Fluent API 中一对多的配置看起来很简单:

HasMany(e => e.Items).WithRequired(i => i.SomeEntity).WillCascadeOnDelete(true);

但实现默认项目的解决方案已被证明是难以捉摸的。我尝试了这个(以及各种变体)但没有运气。它告诉我“指定的架构无效”。

HasOptional(e => e.DefaultItem).WithRequired(i => i.SomeEntity);

有什么想法吗?提前致谢。

【问题讨论】:

标签: c# entity-framework one-to-many


【解决方案1】:

这有点不典型的“设置”(通常通过项目上的一些“标志”来指定 - 但我可能会看到需要类似的东西),并将一个项目与同一个父项关联两次。

但是,这应该可以工作......

modelBuilder.Entity<SomeEntity>()
    .HasOptional(x => x.DefaultItem)
    .WithOptionalPrincipal() // x => x.DefaultForEntity)
    .WillCascadeOnDelete(false);
...
// public SomeEntity DefaultForEntity { get; set; } // optional

...并像这样使用它:

var item = new Item { ItemName = "Default1", };
db.SomeEntities.Add(new SomeEntity { DefaultItem = item, Items = new[]
{
    item,
    new Item{ ItemName = "Item1", },
    new Item{ ItemName = "Item2", },
    new Item{ ItemName = "Item3", },
    new Item{ ItemName = "Item4", },
}
});
db.SaveChanges();

【讨论】:

  • 成功了。非常感谢!我没有使用标志的原因是因为这将允许设置两条记录的标志。拥有一个包含默认项目 ID 的字段可确保数据中不会出现任何错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多