C# 扩展实体框架属性

C# 扩展实体框架属性,c#,entity-framework,C#,Entity Framework,我有一个名为File的实体,我创建了一个带有属性的分部类 我能够在常规构造函数和其他语句中使用此属性。但在任何linq语句中都不接受此属性 我得到以下例外情况 例外情况 public partial class ICFile { [DataMemberAttribute()] public FileStatus FileStatus { get { return (FileStatus)this.Status;

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

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

我得到以下例外情况

例外情况

public partial class ICFile
{
    [DataMemberAttribute()]
    public FileStatus FileStatus
    {
        get
        {
            return (FileStatus)this.Status;
        }
        set
        {
            this.Status = (int)value;
        }
    }
}
LINQ to实体中不支持指定的类型成员“FileStatus”。仅支持初始值设定项、实体成员和实体导航属性

代码

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;
        }
    }
}

我认为问题在于实体框架试图将FileStatus属性转换为数据库中的一列,而该列不存在,并且没有映射信息,因为您在分部类中定义了它

我看到您正在尝试强制转换到枚举,因为您可能使用的是版本5 beta之前的实体框架版本,该版本显然支持枚举(我可能在这一点上错了,也许它仍然缺失)

遗憾的是,在当前的实体框架版本(4.3.1)中,枚举并不能很好地工作。你可以做各种各样的乱七八糟的事情,但是没有一个是非常令人满意的,你经常会意外地将整个表加载到内存中,或者做一些同样可怕的事情(请参阅)

就我个人而言,我不会为partial类操心,而是像这样进行查询,以保持简单:

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,以针对数据库运行(我认为这称为“实用”)。

我认为问题在于实体框架正试图将您的FileStatus属性转换为数据库中的一列,当它不存在并且没有映射信息时,正如您在分部类中定义的那样

我看到您正在尝试强制转换到枚举,因为您可能使用的是版本5 beta之前的实体框架版本,该版本显然支持枚举(我可能在这一点上错了,也许它仍然缺失)

遗憾的是,在当前的实体框架版本(4.3.1)中,枚举并不能很好地工作。你可以做各种各样的乱七八糟的事情,但是没有一个是非常令人满意的,你经常会意外地将整个表加载到内存中,或者做一些同样可怕的事情(请参阅)

就我个人而言,我不会为partial类操心,而是像这样进行查询,以保持简单:

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,以针对数据库运行(我认为这称为“实用”)。

我认为您在代码示例中使用枚举的方式不会导致任何问题。问题很简单,EF无法将类扩展属性识别为
ICFiles
的成员,因为它既不在edmx模型中,也不在数据库表中的列中。使用user1039947给您的代码示例,您应该很好


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

我认为您在代码示例中使用枚举的方式不会导致任何问题。问题很简单,EF无法将类扩展属性识别为
ICFiles
的成员,因为它既不在edmx模型中,也不在数据库表中的列中。使用user1039947给您的代码示例,您应该很好


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

当我问这个问题时,我得到了@user1039947发布的答案。然而,这并不是我所期望的这个问题的答案

我在寻找实体框架完全利用枚举的能力。但最终我发现LINQtoEntity无法识别枚举(它通常通过以Edm开头的属性识别实体,如EdmTypeAttribute、EntityPropertyAttribute等)

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


我已经发布了一个关于这方面的详细信息。

当我问这个问题时,剩下的答案是@user1039947发布的。然而,这并不是我所期望的这个问题的答案

我在寻找实体框架完全利用枚举的能力。但最终我发现LINQtoEntity无法识别枚举(它通常通过以Edm开头的属性识别实体,如EdmTypeAttribute、EntityPropertyAttribute等)

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


我已经发布了一个关于这方面的详细信息。

您是将代码优先还是数据库优先用于edmx文件,还是使用其他方法(可能是T4生成的代码)?我不认为您可以在实体框架中使用分部类,但如果有更多的信息,可能有一种方法可以使其工作。您是使用代码优先还是数据库优先使用edmx文件或其他方法(可能是T4生成的代码)?我认为不能将分部类与实体framewo一起使用