2010-07-08 26 views
1

我越来越想运行此代码时,出现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识别这个属性映射属性?

回答

1

该类的所有部分都应该有部分关键字。你的代码结构真的很奇怪,你甚至可以确定每次调用哪个实现(如果有不同的实现)?

也许你可以制作几个继承Produkt而不是类的几个部分的类。

+0

好吧,只有DAL.Linq.Produkt类的两个部分(我省略了第二位代码中的名称空间声明 - 现在添加它,对不起) Class Interfaces.Model.Produkt is the base类DAL.Linq.Produkt类派生自。 而我的问题出现正是因为我试图做你的建议,那就是 - 使用继承而不是使一个类负责一切。 – 2010-07-08 12:43:08

+0

类Interfaces.Model.Produkt是DAL.Linq.Produkt类派生自的基类。这不是你在这里做的,因为所有三个班都有相同的班名! – MrFox 2010-07-09 10:01:11

+0

这是不正确的。他们在不同的命名空间。如果我会按照你的建议做,我会得到关于重复类定义的编译错误。 感谢您的努力,但您并没有真正关注这个问题。 – 2010-07-09 12:09:07