2013-11-27 54 views
0

我有第三方类模型(不能修改),我需要使用EF持久化它。问题是该模型的某些类没有ID属性,也没有任何可用作使用Fluent API生成表的键的属性。实体框架ID属性

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

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

+0

您是否尝试过使用这些模型作为您自己的ID属性模型的基类? –

+0

模型很大,所以我必须在转换过程中花费很多精力来包装很多类。这种方法应该可行,但另一种方法可以减少包装转换? –

回答

1

除非第三方类别为sealed,否则您应该可以将其用作基类,并从中派生出更友好的类。例如:

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

public class myFoo : Foo 
{ 
    public long FooId {get; set;} 
} 

如果sealed你仍然可以写它周围

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

public class FooWrapper 
{ 
    public long FooId {get; set;} 
    public Foo InnerFoo {get; set;} 
} 

在这两种情况下的包装,然后你可以坚持你的自定义对象(派生类或包装)到您的DB,然后随时提取原始Foo

编辑 根据您的评论,您也可以调查使用组合键。坦率地说,我从未在EF中使用过它们,所以我甚至不知道该从哪里开始告诉你,但它们可能更适合你的具体需求。

+0

第二种方法不会出于同样的原因:“Foo”类没有ID属性,因此EF无法保留表“Foo”,并且无法将其与表“FooWrapper”相关联。如果我在应用程序中创建和使用模型,第一种方法可以工作,但情况并非如此,因为我的应用程序只调用第三方模型的一种方法,该方法使用自己的类(“Foo”类等)创建所有模型,而不是我的类(在这种情况下是“myFoo”类)。 –

+0

在这种情况下,你不会坚持你的'Foo'类。你坚持你的'FooWrapper',它恰好包含'Foo'。您可能需要从'FooWrapper'到您的数据库中定义特定的地图。很有可能,派生类或组合键在您的特定情况下会更好地工作。 – AllenG

+0

复合键可以在某些情况下工作,但不能在其他情况下工作,例如日期。该模型只有三个字段的日期类别:日,月和年。包含所有三个成员的组合键是一个想法,但当EF尝试插入表中已存在的记录时,问题就出现在运行时。 –