I'm getting a InvalidOperationException when trying to run this code:
database.Produkts.SingleOrDefault<Produkt>(x => x.Kod == "123")
It only occurs when the Kod
property has an override modifier.
I need it this way because the entity class is derived from another class that resides in a separate assembly.
Here's how the classes are defined:
The base class:
namespace Interfaces.Model
{
[DataContract(Name = "Produkt", Namespace = "")]
public class Produkt
{
[DataMember]
public virtual string Kod { get; set; }
...
The class generated by 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();
}
}
}
...
And the second part of the definition:
namespace DAL.Linq
{
[DataContract(Name = "Produkt", Namespace = "")]
partial class Produkt : Interfaces.Model.Produkt
{
}
}
Now retrieving all the instances from the database (without the filter/where caluse) will work just fine. It's only that building a predicate that includes the overridden property will not.
I assume that it's some kind of a problem related to retr开发者_StackOverflow中文版ieving the property's attributes with reflection as the exception gets thrown from the method GetDataMember
of the System.Data.Linq.Mapping.MetaType
class.
My real question is if this is a Linq bug or can I somehow make Linq recognize this property to attribute mapping?
All parts of the class should have the keyword partial.
Your code structure is really wierd, how do you even determine which implementation you are calling each time (if there are different implementations)?
Maybe you can make several classes that inherit Produkt instead of several partial parts of the class.
Found a workaround here: http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/016ad28b-f813-4f26-9e70-2265a1943bad
In short: the query works after modifying it like this:
database.Produkts.SingleOrDefault<Produkt>(x => ((DAL.Linq.Produkt)x).Kod == "123")
The cast should be obsolete (and f.i. Resharper marks it as such) but evidently it does make a difference when reflection methods are applied to the resulting Expression objects.
精彩评论