2013-04-01 135 views
2

我试图在实体框架中执行一对多的关系,其中许多项目之一可选地被指定为默认值。实体框架一对多默认

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); 

但对于实现默认项目的解决方案已被证明是难以捉摸的。我试过这个(和各种变化),没有运气。它告诉我'指定的Schema无效'。

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

任何想法?提前致谢。

+0

http://stackoverflow.com/questions/12458887/entity-framework-fluent -api-to-map-simple-one-to-many-relation – IamStalker

回答

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(); 
+0

这样做了。非常感谢!我没有使用标志的原因是因为这将允许两个记录设置标志的可能性。拥有一个包含默认项目Id的单个字段可确保数据中不存在任何错误。 – RogerMKE

+0

不客气罗杰 – NSGaga