我正在尝试在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; }
}
流畅的API中的一对多配置似乎非常简单:
HasMany(e => e.Items).WithRequired(i => i.SomeEntity).WillCascadeOnDelete(true);
但实施默认项目的解决方案已被证明是难以捉摸的。我试过这个(和各种变化)没有运气。它告诉我“指定的架构无效”。
HasOptional(e => e.DefaultItem).WithRequired(i => i.SomeEntity);
有什么想法吗?提前谢谢。
答案 0 :(得分:2)
这有点不典型的'设置'(它通常通过项目上的某个'标志'指定 - 但我可能会看到需要类似的东西),并将一个项目与同一个父项相关联两次。
然而,这应该有用......
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();