实体框架保存类没有来自外部源的Id

时间:2017-04-20 23:45:51

标签: c# entity-framework

给定来自外部源的类(在我的例子中是NuGet包):

public class Apple {
    // Some properties
}

dbContext中存储此内容的最佳方法是什么?

请注意,我不能使用以下内容,因为Apple没有Id:

DbSet<Apple> Apples {get; set;}

现在我的(天真)解决方案是使用mapper函数在已创建的数据库I中存储类似的类,然后在我想从NuGet包访问对象时调用它们。

感谢您的任何建议!

1 个答案:

答案 0 :(得分:2)

为了解决这个问题,我可以提供两种解决方案:(你需要添加原始Apple类的适当参考)

第一个解决方案(使用继承 - 更简单的解决方案)

我会创建一个继承自Apple类的类和一个Id属性。

public class MyApple: Apple
{
    public int Id { get; set; }
} 

然后将新创建的类添加到DbContext。

DbSet<MyApple> MyApples {get; set;}

第二种解决方案(使用ComplexType)

第二个解决方案是创建一个类似上面的类,没有继承和引用Apple类。

public class MyApple
{
    public int Id { get; set; }
    public Apple Apple { get; set; }
}

将原始Apple类作为ComplexType

a)通过Fluent Api(在您的上下文类中)

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.ComplexType<Apple>();
} 

在第二个解决方案中,您将看到列名称; Apple_OriginalColumnName1,Apple_OriginalColumnName2

要解决这些问题,您可以使用Fluent Api中的HasColumnName更改那些。

b)或通过数据注释

(如果你可以修改Apple课程,但你不想在这里添加Id属性。不适合你的问题,但对其他人来说可能更简单..)

[ComplexType]
public class Apple
{
     [Column("ColumnName1")]
     public string ColumnName1 { get; set; }
     ...
}

[ComplexType] attributeof该表是此处的核心解决方案。

[Column("ColumnName1")]属性将修复Apple_ColumnName1问题。