我越来越想运行此代码时,出现InvalidOperationException:为什么LINQ to sql不允许在where子句中使用“override”继承修饰符的meber?
database.Produkts.SingleOrDefault<Produkt>(x => x.Kod == "123")
它只有在Kod
酒店override修饰符的发生。 我需要这种方式,因为实体类是从驻留在单独程序集中的另一个类派生的。
下面是如何的类中定义:
基类:
namespace Interfaces.Model
{
[DataContract(Name = "Produkt", Namespace = "")]
public class Produkt
{
[DataMember]
public virtual string Kod { get; set; }
...
通过LINQ的生成的类:
namespace DAL.Linq
{
[Table(Name="dbo.Produkt")]
public partial class Produkt : INotifyPropertyChanging, INotifyPropertyChanged
{
[Column(Storage="_Kod", DbType="NVarChar(50) NOT NULL", CanBeNull=false)]
public override string Kod
{
get
{
return this._Kod;
}
set
{
if ((this._Kod != value))
{
this.OnKodChanging(value);
this.SendPropertyChanging();
this._Kod = value;
this.SendPropertyChanged("Kod");
this.OnKodChanged();
}
}
}
...
而定义的第二部分:
namespace DAL.Linq
{
[DataContract(Name = "Produkt", Namespace = "")]
partial class Produkt : Interfaces.Model.Produkt
{
}
}
现在从数据库中检索所有实例(没有过滤器/ caluse)将工作得很好。只是构建一个包含重写属性的谓词不会。
我认为这是某种与使用反射检索属性属性有关的问题,因为异常从System.Data.Linq.Mapping.MetaType
类的方法GetDataMember
抛出。
我真正的问题是,如果这是一个Linq错误,或者我可以以某种方式让Linq识别这个属性映射属性?
好吧,只有DAL.Linq.Produkt类的两个部分(我省略了第二位代码中的名称空间声明 - 现在添加它,对不起) Class Interfaces.Model.Produkt is the base类DAL.Linq.Produkt类派生自。 而我的问题出现正是因为我试图做你的建议,那就是 - 使用继承而不是使一个类负责一切。 – 2010-07-08 12:43:08
类Interfaces.Model.Produkt是DAL.Linq.Produkt类派生自的基类。这不是你在这里做的,因为所有三个班都有相同的班名! – MrFox 2010-07-09 10:01:11
这是不正确的。他们在不同的命名空间。如果我会按照你的建议做,我会得到关于重复类定义的编译错误。 感谢您的努力,但您并没有真正关注这个问题。 – 2010-07-09 12:09:07