扩展实体框架属性

时间:2012-03-19 14:34:52

标签: c# entity-framework

我有一个名为File的实体,我创建了一个带有属性的分部类。

我能够在常规构造函数和其他语句中使用此属性。但是在任何linq声明中都不接受此属性。

我收到以下异常。

异常

指定的类型成员' FileStatus' LINQ to Entities不支持。仅支持初始化程序,实体成员和实体导航属性。

代码

var fileEntry = from entry in context.ICFiles
                             where entry.FileName == FileName &&
                                   entry.FileStatus == FileStatus.InProgress
                             select entry;

fileEntry.First().FileStatus = FileStatus.Completed; 
// This is where I get the exception

属性定义

public partial class ICFile
{
    [DataMemberAttribute()]
    public FileStatus FileStatus
    {
        get
        {
            return (FileStatus)this.Status;
        }
        set
        {
            this.Status = (int)value;
        }
    }
}

3 个答案:

答案 0 :(得分:4)

我认为问题在于实体框架正在尝试将您的FileStatus属性转换为数据库中的一个列,该列不存在,并且没有映射信息可以继续,因为您已经在部分中定义了它类。

我看到你试图强制转换为枚举,因为大概是你在版本5 beta之前使用了Entity Framework版本,显然有枚举支持(我可能错了,也许它仍然缺失)。< / p>

遗憾的是,在当前的Entity Framework版本(4.3.1)中,枚举并不能很好地工作。你可以做各种各样的克拉,但没有一个是非常令人满意的,你经常最终不小心将整个表加载到内存或同样可怕的东西(见Using ADO.net Entity Framework 4 with Enumerations? How do I do it?)。

就个人而言,我只是不打扰部分类并像这样做你的查询,以保持简单:

var fileEntry = from entry in context.ICFiles
                         where entry.FileName == FileName &&
                               entry.Status == (int)FileStatus.InProgress
                         select entry;

fileEntry.First().Status = (int)FileStatus.Completed; 

不理想,但它有效并且它显示了正在发生的事情,并且您知道where子句将被正确地转换为对数据库运行的等效SQL(我认为这称为“实用”)。

答案 1 :(得分:0)

我不认为您在代码示例中使用Enums的方式会导致任何问题。问题很简单,您的类扩展属性不被EF识别为ICFiles的成员,因为它实际上不在您的edmx模型中,也不在数据库表中的列中。使用代码示例 user1039947 给了您,您应该没问题。

但是,在ICFiles IEnumerable实例上执行LINQ to Object搜索时,可以使用原始查询。这是因为LINQ to Entities在从数据库获取数据之前被转换为SQL,而LINQ to objects在内存中完成。您的FileStatus属性在您的数据库中不存在,仅在内存中。

答案 2 :(得分:0)

当我问这个问题时,我留下了@ user1039947发布的答案。但是,这不是我期待的那个问题的答案。

我一直在寻找Entity框架完全利用Enum的能力。但最终我发现Linq to Entity无法识别Enums(它通常通过以Edm开头的属性识别实体,如EdmTypeAttribute,EntityPropertyAttribute等。)

Linq to Entity of Framework 4.0,无法接受枚举作为实体对象。但是,部分方法为我们提供了从枚举中可能需要的80%。

我已经发布了blog更详细的信息。