C# 如何在实体框架中将自定义类型用作列

C# 如何在实体框架中将自定义类型用作列,c#,entity-framework,C#,Entity Framework,如何使用复杂类型(如int)查询数据库 我有一张这样的桌子: ID | Name ----+------- 1 | Foo 2 | Bar [Table("MyEntityTable")] public class MyEntity{ [Column("ID")] public CustomId ID {get;set;} [Column("Name")] public string Name {get;set;} } public class

如何使用复杂类型(如int)查询数据库

我有一张这样的桌子:

ID  |  Name
----+-------
1   |  Foo
2   |  Bar
[Table("MyEntityTable")]
public class MyEntity{
    [Column("ID")]
    public CustomId ID {get;set;}
    [Column("Name")]
    public string Name {get;set;}
}
public class CustomId {
    public int ID => GetId();
    public object SomeObject {get;set;}

    public CustomId(object o){
        SomeObject = o;
    }

    private int GetId() => //logic returns a unique ID that maps to database column.
}
我有一个实体,看起来像这样:

ID  |  Name
----+-------
1   |  Foo
2   |  Bar
[Table("MyEntityTable")]
public class MyEntity{
    [Column("ID")]
    public CustomId ID {get;set;}
    [Column("Name")]
    public string Name {get;set;}
}
public class CustomId {
    public int ID => GetId();
    public object SomeObject {get;set;}

    public CustomId(object o){
        SomeObject = o;
    }

    private int GetId() => //logic returns a unique ID that maps to database column.
}
我如何告诉实体框架,当某个东西是
CustomId
时,它应该只将
int
部分映射到指定的列,而忽略其余部分

所以我可以这样做:

var id = new CustomId(myObject);
var entity = db.MyEntitys.First(e => e.ID == id);

你不知道,那是行不通的。您可以将自定义类型映射到表,并将该类型中的公共属性(原子类型,如string、int、decimal等)映射到列。如果需要关系,则可以使用自定义类型作为属性,但该类型应与另一个表相对应,以便您可以设置正确的表关系。@Igor但它是用原子类型映射的。在数据库中,它是一个int,而CustomId实际上是一个int,它是通过使用对象
类来构造而生成的。CustomId
不是原子类型,EF无法映射它。您在枚举之外定义的任何类型都不会被视为原子类型,因为它与EF一起工作。@Igor我知道CustomId不是原子的,但是位实体框架应该关心的唯一一个是原子的。肯定有办法告诉EF如何处理CustomId?换句话说,如果您想通过CustomId进行搜索,只需向数据库发送ID,它就会为您提供正确的位。EF无法将其转换为存储查询,这就是它不受支持的原因。没有已知的机制将任意linq表达式转换为存储表达式(即sql),这就是为什么您仅限于原子类型(除其他外)。