【问题标题】:Unable to create a constant value of type. Only use primitive types无法创建类型的常量值。只使用原始类型
【发布时间】:2012-01-27 03:06:10
【问题描述】:

我已经阅读了一些其他帖子,但它们没有帮助。

CarPart 是 EF4 生成的类

[EdmEntityTypeAttribute(NamespaceName="xxxx.Data.Domain.Model", Name="CarPart")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class CarPart : EntityObject
{
    #region Factory Method

    /// summary>
    /// Create a new CarPart object.
    /// </summary>
    /// <param name="carPartId">Initial value of the CarPartId property.</param>
    /// <param name="name">Initial value of the Name property.</param>
    /// <param name="carPartTypeId">Initial value of the CarPartId property.</param>
    public static CarPart CreateCarPart(global::System.Int32 carPartId, global::System.String name, global::System.Int32 carPartId)
    {
        CarPart carPart = new CarPart();
        carPart.CarPartId = carPartId;
        carPart.Name = name;
        carPart.CarPartTypeId = carPartTypeId;
        return carPart;
    }

    #endregion
    #region Primitive Properties

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Int32 CarPartId
    {
        get
        {
            return _CarPartId;
        }
        set
        {
            if (_CarPartId != value)
            {
                OnCarPartIdChanging(value);
                ReportPropertyChanging("CarPartId");
                _CarPartId = StructuralObject.SetValidValue(value);
                ReportPropertyChanged("CarPartIdId");
                OnCarPartIdChanged();
            }
        }
    }
    private global::System.Int32 _CarPartId;
    partial void OnCarPartIdChanging(global::System.Int32 value);
    partial void OnCarPartIdChanged();

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.String Name
    {
        get
        {
            return _Name;
        }
        set
        {
            OnNameChanging(value);
            ReportPropertyChanging("Name");
            _Name = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("Name");
            OnNameChanged();
        }
    }
    private global::System.String _Name;
    partial void OnNameChanging(global::System.String value);
    partial void OnNameChanged();

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Int32 CarPartTypeId
    {
        get
        {
            return _CarPartTypeId;
        }
        set
        {
            OnCarPartTypeIdChanging(value);
            ReportPropertyChanging("CarPartTypeId");
            _CarPartTypeId = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("CarPartTypeId");
            OnCarPartTypeIdChanged();
        }
    }
    private global::System.Int32 _CarPartTypeId;
    partial void OnCarPartTypeIdChanging(global::System.Int32 value);
    partial void OnCarPartTypeIdChanged();

    #endregion

    #region Navigation Properties

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    [XmlIgnoreAttribute()]
    [SoapIgnoreAttribute()]
    [DataMemberAttribute()]
    [EdmRelationshipNavigationPropertyAttribute("xxxx.Data.Domain.Model", "FK_CarPartId", "Part")]
    public EntityCollection<Part> Parts
    {
        get
        {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Part>("xxxxx.Data.Domain.Model.FK_CarPartId", "Part");
        }
        set
        {
            if ((value != null))
            {
                ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Part>("xxxx.Data.Domain.Model.FK_CarPartId", "Part", value);
            }
        }
    }

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    [XmlIgnoreAttribute()]
    [SoapIgnoreAttribute()]
    [DataMemberAttribute()]
    [EdmRelationshipNavigationPropertyAttribute("xxxxx.Data.Domain.Model", "FK_CarPartTypeId", "CarPartType")]
    public CarPartType CarPartType
    {
        get
        {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<CarPartType>("xxxx.Data.Domain.Model.FK_CarPartTypeId", "CarPartType").Value;
        }
        set
        {
            ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<CarPartType>("xxxxx.Data.Domain.Model.FK_CarPartTypeId", "CarPartType").Value = value;
        }
    }
    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    [BrowsableAttribute(false)]
    [DataMemberAttribute()]
    public EntityReference<CarPartType> CarPartTypeReference
    {
        get
        {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<CarPartType>("xxxx.Data.Domain.Model.FK_CarPartTypeId", "CarPartType");
        }
        set
        {
            if ((value != null))
            {
                ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<CarPartType>("xxxxxx.Data.Domain.Model.FK_CarPartTypeId", "CarPartType", value);
            }
        }
    }

    #endregion
}

这是我的加入代码:

List<Parts> parts = _context.Parts.Where(p => p.PartId == partId).ToList();

List<CarParts> parts = _context.CarParts
     .Join(parts, cp => cp.PartId, p => p.PartId, (cp, p) => cp).ToList();

错误:无法创建“Model.CarParts”类型的常量值。仅有的 支持原始类型(“例如 Int32、String 和 Guid”) 这个上下文。

试图查看它,但无法通过它。我对 LINQ-To-SQL 有点陌生..做了很多但不是很多(主要是 LINQ to Objects)所以新加入这个。

【问题讨论】:

  • 我不知道 DL 类 是什么。你能把Model.Token的代码贴出来吗?
  • 数据层。 makup 只是一个 EF4(实体框架)生成类型。

标签: entity-framework linq-to-sql entity-framework-4


【解决方案1】:

如果我理解正确,你想做这样的事情:

internal class Db
{
    public Db()
    {
        var parts = new List<Part>
                        {
                            new Part() {PartId = 1, PartName = "Part 1"},
                            new Part() {PartId = 2, PartName = "Part 2"},
                        };
        Parts = parts.AsQueryable();
        var carParts = new List<CarPart>
                           {
                               new CarPart() {CarPartId = 1, CarPartName = "Car Part 1.1", PartId = 1},
                               new CarPart() {CarPartId = 1, CarPartName = "Car Part 1.2", PartId = 1},
                               new CarPart() {CarPartId = 1, CarPartName = "Car Part 2.1", PartId = 2},
                           };
        CarParts = carParts.AsQueryable();
    }

    public IQueryable<Part> Parts { get; set; }
    public IQueryable<CarPart> CarParts { get; set; }
}

internal class CarPart
{
    public int CarPartId { get; set; }
    public string CarPartName { get; set; }
    public int PartId { get; set; }
}

internal class Part
{
    public int PartId { get; set; }
    public string PartName { get; set; }
}

    static void Main(string[] args)
    {
        Db db = new Db();

        var result = from carPart in db.CarParts
                     join part in db.Parts on carPart.PartId equals part.PartId
                     select new {Part = part, CarPart = carPart};

        var lambdaResult = db.CarParts.Join(db.Parts, part => part.PartId, caPart => caPart.PartId,
                                            (carPart, part) => new {CarPart = carPart, Part = part});

        foreach (var item in result)
        {
            Console.WriteLine(item.Part.PartName);
            Console.WriteLine(item.CarPart.CarPartName);
        }
        Console.WriteLine("------------");
        foreach (var item in lambdaResult)
        {
            Console.WriteLine(item.Part.PartName);
            Console.WriteLine(item.CarPart.CarPartName);
        }
}

结果是一个新的匿名对象,其中加入的对象作为内容。 它会将其打印到控制台:

Part 1
Car Part 1.1
Part 1
Car Part 1.2
Part 2
Car Part 2.1
-------    
Part 1
Car Part 1.1
Part 1
Car Part 1.2
Part 2
Car Part 2.1

【讨论】:

  • 关闭我希望通过 PartId 将 CarParts 加入到 Parts..所以所有 CarParts 都与特定的 PartId 相关(是的,它是倒退的,但这只是一个示例)
  • 所以我必须使用 from 语法?我尽量远离它,因为它对我来说很混乱......我更喜欢 lambda 语法
  • 您可以根据需要将其转换为 lambda。对我来说,它更像是一个 sql 查询,我可以更好地获取语句的内容。你的选择;)
  • 嗯,我的意思是我一开始就是这样,只是使用 lambda 的另一种方式,但让我试试你的
  • 如果添加了 lambda 示例。更好的? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多