C# 实体框架ID属性

C# 实体框架ID属性,c#,entity-framework,C#,Entity Framework,我有一个第三方类模型(不能修改),我需要使用EF来持久化它。问题在于,该模型的某些类没有ID属性,也没有任何属性可以用作使用fluentapi生成的表的键 我还想在分部类中定义ID属性,但分部类不能位于不同的程序集上,所以解决方案是不可行的。我的脑海中闪过了反思,但我认为这是不可能的 有没有一种方法(使用Fluent API或其他技术)可以将属性(例如自动增量)添加到无法修改的存在模型中 除非第三方类是密封的,否则您应该能够将其用作基类,并从中派生出更友好的类。例如: public class

我有一个第三方类模型(不能修改),我需要使用EF来持久化它。问题在于,该模型的某些类没有ID属性,也没有任何属性可以用作使用fluentapi生成的表的键

我还想在分部类中定义ID属性,但分部类不能位于不同的程序集上,所以解决方案是不可行的。我的脑海中闪过了反思,但我认为这是不可能的


有没有一种方法(使用Fluent API或其他技术)可以将属性(例如自动增量)添加到无法修改的存在模型中

除非第三方类是密封的,否则您应该能够将其用作基类,并从中派生出更友好的类。例如:

public class Foo //3rd party class
{ ... }

public class myFoo : Foo
{
    public long FooId {get; set;}
}
如果它是
密封的
您仍然可以在它周围写一个包装器

public sealed class Foo //3rd party sealed class
{ ... }

public class FooWrapper
{
    public long FooId {get; set;}
    public Foo InnerFoo {get; set;} 
}
在这两种情况下,您都可以将自定义对象(派生类或包装器)持久化到数据库中,然后根据需要提取原始
Foo

编辑
根据您的评论,您还可以研究使用复合键。坦白地说,我从来没有在EF中使用过它们,所以我甚至不知道从哪里开始向您介绍它们,但它们可能更适合您的特定需求。

您是否尝试过将这些模型用作具有ID属性的您自己的模型的基类?模型很大,因此我必须在转换过程中花费大量精力包装大量类。这种方法应该可以工作,但另一种方法如何进行较少的包装转换呢?第二种方法由于相同的原因不起作用:“Foo”类没有ID属性,因此EF不能持久化表“Foo”,也不能将其与表“FooWrapper”相关联。如果我在应用程序中创建和使用模型,第一种方法可以工作,但事实并非如此,因为我的应用程序只调用第三方模型的一个方法,而该方法使用自己的类(“Foo”类等)而不是我的类(“myFoo”类)创建所有模型.在这种情况下,您不会持久化
Foo
类。您正在持久化
FooWrapper
,它恰好包含
Foo
。您可能必须定义从
FooWrapper
到数据库的特定映射。很可能,派生类或复合键在特定场景中会更好地工作。复合键在某些情况下可以工作,但在其他情况下不能工作,例如日期。该模型有一个日期类,只有三个字段:日、月和年。包含所有三个成员的复合键是一个好主意,但当EF尝试插入表中已经存在的记录时,问题会在运行时出现。是的,应该可以工作,但编码映射的工作量很大,模型有几十个类,每个类都有几十个属性。那么另一种更少携带映射代码的方法呢?然后我声明该模型有味道。此外,您可能会再次检查一些假设。在所有的时间里只有
n
个日期,而你要处理的只是其中的一小部分。为什么有一个表只将日期定义为d/m/yyyy(并且每个表都定义为不同的列?)?为什么要把它分开放在一张桌子上?您可能不需要保留所有这些数据(这限制了您必须映射的内容)。