Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework Automapper Projectto无法使用struct创建映射表达式_Entity Framework_Automapper_Typeconverter_Webapi - Fatal编程技术网

Entity framework Automapper Projectto无法使用struct创建映射表达式

Entity framework Automapper Projectto无法使用struct创建映射表达式,entity-framework,automapper,typeconverter,webapi,Entity Framework,Automapper,Typeconverter,Webapi,在使用ProjectTo进行查询时,是否有一种方法可以支持将“包装”的域模型作为映射中的结构? 例如,我有一个名为Edition的结构,它表示许可证版本。在数据库中,该列存储为整数。但是,在使用WebApi时,此类字段将作为结构版返回。您可能会问,如果它是WebApi,只需在模型中返回int即可。好的,这就是我们在封面下所做的,但是我们也有一个用于api的SDK,在这个SDK中,我们对返回的类进行建模,使其具有Edition,而不是int,因此开发人员很清楚数据的含义。 我们已经创建了.netT

在使用ProjectTo进行查询时,是否有一种方法可以支持将“包装”的域模型作为映射中的结构? 例如,我有一个名为Edition的结构,它表示许可证版本。在数据库中,该列存储为
整数
。但是,在使用WebApi时,此类字段将作为结构版返回。您可能会问,如果它是WebApi,只需在模型中返回int即可。好的,这就是我们在封面下所做的,但是我们也有一个用于api的SDK,在这个SDK中,我们对返回的类进行建模,使其具有
Edition
,而不是
int
,因此开发人员很清楚数据的含义。 我们已经创建了.net
TypeConverters
和Newtonjson转换器,除了
AutoMapper
在使用
ProjectTo

Edition+EditionTypeConverter

[TypeConverter(typeof(EditionTypeConverter))]
    [Serializable]
    public struct Edition : ISerializable
    {
        /// <summary>
        /// Prefer using <see cref="Edition.Community"/> instead.
        /// This only exists to support using <see cref="Edition"/> on <see cref="System.Attribute"/>.
        /// </summary>
        public const int CommunityNumber = 1024;
        /// <summary>
        /// Prefer using <see cref="Edition.Standard"/> instead.
        /// This only exists to support using <see cref="Edition"/> on <see cref="System.Attribute"/>.
        /// </summary>
        public const int StandardNumber = 1025;
        /// <summary>
        /// Prefer using <see cref="Edition.Enterprise"/> instead.
        /// This only exists to support using <see cref="Edition"/> on <see cref="System.Attribute"/>.
        /// </summary>
        public const int EnterpriseNumber = 1026;
        public static readonly Edition NotLicensed = new Edition(0);
        public static readonly Edition Community = new Edition(CommunityNumber);
        public static readonly Edition Standard = new Edition(StandardNumber);
        public static readonly Edition Enterprise = new Edition(EnterpriseNumber);
        private readonly int edition;

        public Edition(int edition)
        {
            this.edition = edition;
        }

        public Edition(SerializationInfo info, StreamingContext context)
        {
            edition = (int)info.GetValue(nameof(edition), typeof(int));
        }

        public override string ToString()
        {
            if (edition == NotLicensed)
                return "Not Licensed";
            if (edition == Community)
                return nameof(Community);
            if (edition == Standard)
                return nameof(Standard);
            if (edition == Enterprise)
                return nameof(Enterprise);

            return $"Unknown({edition})";
        }

        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            if (!(obj is Edition))
                return false;

            var token = (Edition)obj;
            return token.edition == edition;
        }

        public override int GetHashCode() => edition.GetHashCode();

        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue(nameof(edition), edition);
        }

        public static bool operator !=(Edition left, Edition right) => !(left == right);
        public static implicit operator int(Edition edition) => edition.edition;
        public static bool operator ==(Edition left, Edition right)
        {
            if (ReferenceEquals(left, null))
                return ReferenceEquals(right, null);

            return left.Equals(right);
        }

        public static Edition? From(int? edition) => edition.HasValue ? new Edition(edition.Value) : (Edition?)null;

        public class EditionTypeConverter : TypeConverter
        {
            public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
            {
                return sourceType.GetActualType() == typeof(int) ||
                    sourceType.GetActualType() == typeof(long) ||
                    base.CanConvertFrom(context, sourceType);
            }

            public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
            {
                if (value == null)
                    return null;

                if (int.TryParse(value.ToString(), out int edition))
                    return new Edition(edition);
                if (long.TryParse(value.ToString(), out long longEdition))
                    return new Edition((int)longEdition);

                return base.ConvertFrom(context, culture, value);
            }
        }
    }
context.ScriptVersions.Where(predicate).ProjectTo<ScriptVersionModel>();
ScriptVersion-映射到数据库的实体框架类

public class ScriptVersion
{
   public int? License{get;set;}
}
触发错误的代码

[TypeConverter(typeof(EditionTypeConverter))]
    [Serializable]
    public struct Edition : ISerializable
    {
        /// <summary>
        /// Prefer using <see cref="Edition.Community"/> instead.
        /// This only exists to support using <see cref="Edition"/> on <see cref="System.Attribute"/>.
        /// </summary>
        public const int CommunityNumber = 1024;
        /// <summary>
        /// Prefer using <see cref="Edition.Standard"/> instead.
        /// This only exists to support using <see cref="Edition"/> on <see cref="System.Attribute"/>.
        /// </summary>
        public const int StandardNumber = 1025;
        /// <summary>
        /// Prefer using <see cref="Edition.Enterprise"/> instead.
        /// This only exists to support using <see cref="Edition"/> on <see cref="System.Attribute"/>.
        /// </summary>
        public const int EnterpriseNumber = 1026;
        public static readonly Edition NotLicensed = new Edition(0);
        public static readonly Edition Community = new Edition(CommunityNumber);
        public static readonly Edition Standard = new Edition(StandardNumber);
        public static readonly Edition Enterprise = new Edition(EnterpriseNumber);
        private readonly int edition;

        public Edition(int edition)
        {
            this.edition = edition;
        }

        public Edition(SerializationInfo info, StreamingContext context)
        {
            edition = (int)info.GetValue(nameof(edition), typeof(int));
        }

        public override string ToString()
        {
            if (edition == NotLicensed)
                return "Not Licensed";
            if (edition == Community)
                return nameof(Community);
            if (edition == Standard)
                return nameof(Standard);
            if (edition == Enterprise)
                return nameof(Enterprise);

            return $"Unknown({edition})";
        }

        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            if (!(obj is Edition))
                return false;

            var token = (Edition)obj;
            return token.edition == edition;
        }

        public override int GetHashCode() => edition.GetHashCode();

        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue(nameof(edition), edition);
        }

        public static bool operator !=(Edition left, Edition right) => !(left == right);
        public static implicit operator int(Edition edition) => edition.edition;
        public static bool operator ==(Edition left, Edition right)
        {
            if (ReferenceEquals(left, null))
                return ReferenceEquals(right, null);

            return left.Equals(right);
        }

        public static Edition? From(int? edition) => edition.HasValue ? new Edition(edition.Value) : (Edition?)null;

        public class EditionTypeConverter : TypeConverter
        {
            public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
            {
                return sourceType.GetActualType() == typeof(int) ||
                    sourceType.GetActualType() == typeof(long) ||
                    base.CanConvertFrom(context, sourceType);
            }

            public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
            {
                if (value == null)
                    return null;

                if (int.TryParse(value.ToString(), out int edition))
                    return new Edition(edition);
                if (long.TryParse(value.ToString(), out long longEdition))
                    return new Edition((int)longEdition);

                return base.ConvertFrom(context, culture, value);
            }
        }
    }
context.ScriptVersions.Where(predicate).ProjectTo<ScriptVersionModel>();
context.ScriptVersions.Where(谓词).ProjectTo();
您可以使用此

public IMapper InitializeMapper()
{
var配置=新的MapperConfiguration(cfg=>
{
cfg.CreateMap().formMember(a=>a.License,map=>map.MapFrom(src=>newedition(src.License??0));
});
返回configuration.CreateMapper();
}
然后

var-mapper=InitializeMapper();
ScriptVersionModelEdition=mapper.Map(新的ScriptVersion{License=12});

context.ScriptVersions.Where(谓词).ProjectTo();
CreateMap()