简体   繁体   English

AutoMapper错误:类映射到数据类型(byte [])

[英]AutoMapper error: class maps to a datatype (byte[])

I have two classes, each having a domain and a repo version. 我有两个类,每个类都有一个域和一个仓库版本。

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

REPO: 回购:

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

And here are their mappings: 这是他们的映射:

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

When I am trying to query for a ClassA that has a one to one relationship with ClassB which also has a one to one relationship with MusicInfo, an error occurs that says: 当我尝试查询与ClassB具有一对一关系且与MusicInfo具有一对一关系的ClassA时,发生错误,提示:

Missing type map configuration or unsupported mapping.

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

Destination path:
List`1[0]

Source value:
Blah.MusicImageRepo

but here is how i map them: 但是这是我如何映射它们:

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

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

There are no problems when saving these classes. 保存这些类时没有问题。 I really dont get why the error happens. 我真的不明白为什么会发生错误。 Will really appreciate your help. 会非常感谢您的帮助。

OneToOne says that the other entity/table has the Reference(column). OneToOne表示另一个实体/表具有引用(列)。 It should not work when both sides have a onetoone mapping since they bounce the responsiblity back and forth. 当双方都具有一对一的映射时,它不起作用,因为它们来回地反弹责任。

Also the classes look a bit overcomplicated when all you need is to store the bytes somewhere else. 当您只需要将字节存储在其他位置时,这些类看起来也会有些复杂。

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

Note: think about it if the seperation between DomainModel and MappedModel really makes sense. 注意:如果DomainModel和MappedModel之间的分隔确实有意义,请考虑一下。 NHibernate goes to great length supporting mapping of DomainModels. NHibernate竭尽全力支持DomainModels的映射。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM