C# 使用枚举作为实体框架中作用域的继承结构

C# 使用枚举作为实体框架中作用域的继承结构,c#,performance,entity-framework,enums,C#,Performance,Entity Framework,Enums,这通常是构造实体的方式,将id映射到数据库中的int public class Person { public int Id { get; set; } public string Name { get; set; } } public class Address { public int PersonId { get; set; } public string Street { get; set; } } 我开始为我的实体实施这样的系统: public en

这通常是构造实体的方式,将id映射到数据库中的int

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Address
{
    public int PersonId { get; set; }
    public string Street { get; set; }
}
我开始为我的实体实施这样的系统:

public enum PersonId : int { }

public class Person
{
    public PersonId Id { get; set; }
    public string Name { get; set; }
}

public enum AddressId : int { }

public class Address
{
    public AddressId Id { get; set; }
    public PersonId PersonId { get; set; }
    public string Street { get; set; }
}
将枚举映射到数据库中的int(或其他结构)

通过这种方式,我可以确定方法和代码的作用域,以避免错误地使用personsint id请求特定地址,因为int始终是int

据我所知,F#有类似的内置功能吗


我的问题是,有人知道这是否会以任何方式影响实体框架的性能吗?

在IL级别,枚举只是一个整数;任何一个好的基于运行时的元编程库都应该知道在不进行任何中间转换的情况下直接进入int——如果EF弄错了,我会感到惊讶

然而,对我来说,真正的问题更多的是语义问题;这并不是枚举的真正含义。此外,您可能会在某些序列化和UI工具中遇到问题(当它们正在研究如何用值
100124
表示或解析
AddressId
,等等)


就我个人而言,我不会这么做。混淆值的含义确实是一个潜在的问题,但答案不是滥用类型系统。我“明白”一些语言提供别名/类型定义,允许您以检查的方式执行此操作,但枚举不仅仅是检查的别名,它还意味着更多。

在IL级别,枚举只是一个整数;任何一个好的基于运行时的元编程库都应该知道在不进行任何中间转换的情况下直接进入int——如果EF弄错了,我会感到惊讶

然而,对我来说,真正的问题更多的是语义问题;这并不是枚举的真正含义。此外,您可能会在某些序列化和UI工具中遇到问题(当它们正在研究如何用值
100124
表示或解析
AddressId
,等等)


就我个人而言,我不会这么做。混淆值的含义确实是一个潜在的问题,但答案不是滥用类型系统。我“明白”有些语言提供别名/类型定义,允许您以检查的方式执行此操作,但枚举不仅仅是检查的别名,它还意味着更多。

不会,使用枚举而不是整数肯定不会成为应用程序的瓶颈,但我不明白为什么要使用枚举来表示ID?只需命名属性
PersonId
AddressId
。你不需要枚举。使用int将其与enum包装的好处是,您无法获取带有
PersonId
、带有
地址ID
等的地址,而您可以使用常规的
int
。使用enum而不是整数肯定不会成为应用程序的瓶颈,但我不明白为什么要使用枚举来表示ID?只需命名属性
PersonId
AddressId
。你不需要枚举。将其与枚举一起使用intWrapping的好处是,您无法使用
PersonId
获取地址,也无法使用
ADRESID
获取地址,这可以通过常规的
int
来实现。有点像是猜测了第一部分,在数据库上没有区别,序列化是MVC Json的问题,而不是Json.Net的问题。但我明白用意的问题,用意并非如此。但是EF提供了这种可能性,当使用两个新的enum ID进行重构时,我发现了五个错误,这是由于错误的代码和相关的名称造成的。第一部分有点猜测,在数据库上没有区别,序列化是MVC Json的问题,而不是Json.Net的问题。但我明白用意的问题,用意并非如此。但是EF提供了这种可能性,当使用两个新的枚举ID进行重构时,我发现了五个错误,这是由于错误的代码和相关的名称造成的。