由于映射,EF继承的对象插入失败

时间:2014-02-18 13:14:47

标签: asp.net vb.net entity-framework inheritance

我使用 EDMX 文件创建了一个简单的解决方案,该文件包含一个表Sport,其中包含2个字段IdSportLabel。我想在DB中插入一条记录,其中包含一个由EF创建的Sport对象继承的对象。

Public Class Index
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim aSport As New TestSport()
        Using ctx As New FormationEntities
            ctx.AddObject("Sport", aSport)
            ctx.SaveChanges()
        End Using
    End Sub
End Class

Public Class TestSport
    Inherits Sport
End Class

使用Sport对象可以使用TestSport但不能使用Sport。我需要继承类来添加一些属性和其他功能,但是当我保存它时,我想只保存父对象{{1}}拥有的属性。

错误讯息:

  

无法找到EntityType

的映射和元数​​据信息

我知道通常的方法是使用partial class但是在我的项目中, EDMX 文件在另一个项目中,所以我看到的唯一解决方案是使用继承的类。

我做错了什么?如何解决我的问题?是否存在更好的方法呢?

感谢。

2 个答案:

答案 0 :(得分:2)

在搜索gooogle时,我发现了以下链接,其中讨论了一个非常类似的场景:

Deriving from classes generated by Entity Framework in C#

虽然有一个帖子标记为答案,但第二个答案同样相关。

希望这有帮助。

答案 1 :(得分:1)

实体框架似乎在保存实体期间使用了一种反射,这可能是您的遗产不起作用的原因。您仍然可以使用扩展方法向您的enties添加功能的一种方法(尽管只是函数):http://msdn.microsoft.com/en-us//library/bb383977.aspx

但如果它不仅仅是您需要添加的一些功能,请考虑更具结构性的解决方案。将您的对象的一部分放在数据层中,并将上层的同一对象的一部分放在一起,这不是一个很好的责任分离 不要在数据项目中使用类的一部分(我假设),而是将其中的一部分放在另一个项目中,考虑在项目中创建一个“逻辑类”,它包裹您的实体并以这种方式添加功能。例如,您可以通过直接公开实体来实现此目的:

public class SportLogic  
{  
    private Sport _sport;  
    public Sport Sport { get { return _sport; } }  
    public string SomeNewProperty { get; set; }
    public void DoStuff() {};
}  

或者我使用的方式,逻辑对象充当实体周围的实际逻辑包装器。它更干净,因为它完全混淆了实体:任何调用代码都不需要知道你的实体(Sport)对象。

public class SportLogic
{
    private Sport _sport;
    public string SportProperty { get { return _sport.SportProperty; } set { _sport.SportProperty = value; } }
    public string SomeNewProperty { get; set; }
    public void DoStuff() {};
}