2013-12-08 4 views
0

У меня есть два класса, каждый из которых имеет домен и версию репо.Ошибка AutoMapper: сопоставление классов с типом данных (byte [])

DOMAIN:

public class MusicInfo 
{ 
    public string Id { get; set; } 
    public MusicImage Image { get; set; } 

    public MusicInfo(byte[] image) 
    { 
     this.Image = new MusicImage(this, image); 
    } 
} 

public class MusicImage 
{ 
    public byte[] Blob { get; set; } 
    public MusicInfo MusicInfo { get; set; } 
    public string Id { get; set; } 

    public MusicImage(MusicInfo musicInfo, byte[] blob) 
    { 
     if (musicInfo == null) 
      throw new ArgumentNullException("musicInfo"); 
     if (blob == null) 
      throw new ArgumentNullException("blob"); 

     this.MusicInfo = musiscInfo; 
     this.Blob = blob; 
    } 
} 

РЕПО:

public class MusicInfoRepo 
{ 
    public virtual long Id { get; set; } 
    public virtual MusicImageRepo Image { get; set; } 
} 

public class MusicImageRepo 
{ 
    public virtual byte[] Blob { get; set; } 
    public virtual MusicInfoRepo MusicInfo { get; set; } 
    public virtual long Id { get; set; } 
} 

А вот их отображения:

public class MusicInfoRepoMap : HighLowClassMapping<MusicInfoRepo> 
{ 
    public MusicInfoRepoMap() 
    { 
     Table("MusicInfo"); 

     Id(f => f.Id, m => m.Generator(Generators.HighLow, HighLowMapper)); 

     OneToOne(f => f.Image, m => m.Cascade(Cascade.All)); 
    } 
} 

public class MusicImageRepoMap : ClassMapping<MusicImageRepo> 
{ 
    public MusicImageRepoMap() 
    { 
     Table("MusicImage"); 

     Id(f => f.Id, m => m.Generator(Generators.Foreign<MusicImageRepo>(f => f.MusicInfo))); 

     Property(f => f.Blob, m => 
     { 
      m.NotNullable(true); 
      m.Column(c => c.SqlType("VARBINARY(MAX)")); 
      m.Length(Int32.MaxValue); 
      m.Update(false); 
     }); 

     OneToOne(f => f.MusicInfo, 
     m => 
     { 
      m.Cascade(Cascade.None); 
      m.Constrained(true); 
      m.Lazy(LazyRelation.NoLazy); 
     }); 
    } 
} 

Когда я пытаюсь запросить для ClassA, который имеет 12:59 связь с ClassB, которая также имеет отношения «один к одному» с MusicInfo, возникает ошибка, которая гласит:

Missing type map configuration or unsupported mapping. 

Mapping types: 
MusicImageRepo -> Byte[] 
Blah.MusicImageRepo -> System.Byte[] 

Destination path: 
List`1[0] 

Source value: 
Blah.MusicImageRepo 

но вот как я их отображения:

Mapper.CreateMap<MusicInfo, MusicInfoRepo>(); 
Mapper.CreateMap<MusicInfoRepo, MusicInfo>(); 

Mapper.CreateMap<MusicImage, MusicImageRepo>(); 
Mapper.CreateMap<MusicImageRepo, MusicImage>(); 

Там нет никаких проблем при сохранении этих классов. Я действительно не понимаю, почему происходит ошибка. Поблагодарите вашу помощь.

ответ

0

OneToOne говорит, что другой объект/таблица имеет ссылку (столбец). Он не должен работать, если у обеих сторон есть onetoone mapping, поскольку они отскакивают от ответственности взад и вперед.

Также классы выглядят немного сложнее, когда все, что вам нужно, это хранить байты в другом месте.

public class MusicInfoRepo 
{ 
    public virtual long Id { get; private set; } 
    public virtual MusicImageRepo Image { get; private set; } 

    public MusicInfo(byte[] image) 
    { 
     this.Image = new MusicImageRepo(this, image); 
    } 
} 

public class MusicImageRepo 
{ 
    public virtual MusicInfoRepo MusicInfo { get; private set; } 
    public virtual byte[] Blob { get; set; } 
} 

public class MusicInfoRepoMap : HighLowClassMapping<MusicInfoRepo> 
{ 
    public MusicInfoRepoMap() 
    { 
     Table("MusicInfo"); 

     Id(f => f.Id, m => m.Generator(Generators.HighLow, HighLowMapper)); 

     OneToOne(f => f.Image, m => m.Cascade(Cascade.All)); 
    } 
} 

public class MusicImageRepoMap : ClassMapping<MusicImageRepo> 
{ 
    public MusicImageRepoMap() 
    { 
     Table("MusicImage"); 

     ComposedId(m => m.ManyToOne(x => x.MusicInfo)); 

     Property(f => f.Blob, m => 
     { 
      m.NotNullable(true); 
      m.Column(c => c.SqlType("VARBINARY(MAX)")); 
      m.Length(Int32.MaxValue); 
      m.Update(false); 
     }); 
    } 
} 

Примечание: думать об этом, если Разделения между DomainModel и MappedModel действительно имеет смысл. NHibernate имеет большую длину, поддерживая отображение DomainModels.

Смежные вопросы