0

我必须在复合键上定义递归关系。经过多次尝试,我最终得到了这个:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Category>()
            .Property(t => t.WhichAmazon).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        modelBuilder.Entity<Category>()
            .Property(t => t.IdCategory).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        modelBuilder.Entity<Category>()
           .HasKey(c => new {c.WhichAmazon, c.IdCategory})
           .HasOptional(p => p.Children)
           .WithMany()
           .HasForeignKey(c => new { c.WhichChildrenAmazon, c.ChildrenId });                                                                          
    }

对于这张桌子

public class Category
{
    // Keys and relationships defined in BooksDataLayer
    [MaxLength(2)]
    public string WhichAmazon { get; set; }
    public int IdCategory { get; set; }        
    public string Name { get; set; }
    [Timestamp]
    public Byte[] TimeStamp { get; set; }        
    public DateTime LastCheck { get; set; }
    public virtual List<Book> Books { get; set; }
    public string WhichChildrenAmazon { get; set; }
    public int? ChildrenId { get; set; }        
    public virtual List<Category> Children { get; set; }
}

在尝试添加迁移时,我经常遇到同样的错误:“序列不包含任何元素”。因为我“几乎”确定这个定义是正确的,所以我继续重新创建了一个新的数据库,没有迁移。完全没问题,数据库完全没有问题。所以那里有 EF 6 不喜欢的“东西”。我得到了确认,因为如果我尝试获取模式“调用的目标已抛出异常”,EF 电动工具就会爆炸。

如果我从那里重新开始,我会看看迁移现在会发生什么,但我担心不能再使用这个 Db。我非常喜欢这个工具,所以我希望可以解决这个问题。

4

2 回答 2

1

问题是关系的无效配置。

Fluent API 调用包括:

.HasOptional(p => p.Children)
.WithMany()

这是无效的,因为 Children 是一个集合导航。正确的配置是:

.HasMany(p => p.Children)
.WithOptional()

我们计划进行修复以在 EF6 之后提供更好的异常消息。

于 2013-06-27T17:29:01.333 回答
0

在 EF codeplex 网站上为此打开了一个错误:http: //entityframework.codeplex.com/workitem/1015

于 2013-04-03T17:12:34.660 回答