Отображение отношений в CTP только для кода EF4 (при использовании наследования?) - PullRequest
0 голосов
/ 05 августа 2010

Я создаю простую модель составного объекта с использованием EF4 с функцией CTP "сначала код":

public abstract partial class CacheEntity
{
    [Key]public string Hash { get; set; }
    public string Creator { get; set; }
    public int EntityType { get; set; }
    public string Name { get; set; }
    public string Predecessor { get; set; }
    public DateTime DateTimeCreated { get; set; }

    public virtual ICollection<CacheReference> References { get; set; }
}

public partial class CacheBlob : CacheEntity
{
    public byte[] Content { get; set; }
}

public partial class CacheCollection : CacheEntity
{
    public virtual ICollection<CacheEntity> Children { get; set; }
}

public class CacheReference
{
    public string Hash { get; set; }
    [Key]public string Reference { get; set; }

    public virtual CacheEntity Entity { get; set; }
}

public class CacheEntities : DbContext
{
    public DbSet<CacheEntity> Entities { get; set; }
    public DbSet<CacheReference> References { get; set; }
}

До того, как я разделил производные классы примитивов / коллекций, все работало хорошо, но теперьЯ получаю это:

Unable to determine the principal end of the 'Cache.DataAccess.CacheEntity_References'
relationship. Multiple added entities may have the same primary key.

Я подумал, что это могло запутаться, поэтому я решил изложить это явно, используя свободный интерфейс, а не атрибуты DataAnnotation.Вот что Я думаю, правильно определяет отношения:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<CacheEntity>().HasKey(ce => ce.Hash);
        modelBuilder.Entity<CacheEntity>().HasOptional(ce => ce.References).WithMany();
        modelBuilder.Entity<CacheReference>().HasKey(ce => ce.Reference);
        modelBuilder.Entity<CacheReference>().HasRequired(cr => cr.Entity).WithOptional();
    }

Но я, должно быть, ошибаюсь, потому что теперь я получаю следующее:

Entities in 'CacheEntities.CacheReferenceSet' participate in the 
'CacheReference_Entity' relationship. 0 related 'Entity' were found. 1 'Entity' is expected.

Различные другие способы использованияБеглый API выдает разные ошибки, но ничего не получается, поэтому я начинаю задаваться вопросом, нужно ли делать это по-другому, когда я использую наследование.

Любые подсказки, ссылки, идеи, рекомендации будут приветствоваться.

1 Ответ

0 голосов
/ 11 августа 2010

использование MapHierarchy работает для меня:

protected override void OnModelCreating(ModelBuilder builder){
    builder.Entity<CacheBlob>().HasKey(b=> b.Hash).MapHierarchy(); 
}

В качестве примера.

Дополнительная ссылка: http://blogs.msdn.com/b/efdesign/archive/2009/10/12/code-only-further-enhancements.aspx

...