从使用强制转换的DB放入的实体对象继承的对象

时间:2015-10-28 14:24:04

标签: c# asp.net entity-framework api

我是具有Ruby和Node.js背景的开发人员,但目前正在使用Entity Framework& SQL Server。

我有一个实体" Fon_Campaign",但我想为这个实体添加一些方法,所以我添加了一个对象" Campaign"它继承自" Fon_Campaign",并为这个新对象提供了一个方法isValid(),如果对象是对的,它会监视值和答案。

我的API方法

[Route("Campaigns")]
[HttpPost]
public HttpResponseMessage CreateCampaigns([FromBody]Campaign campaign)
{
    if (campaign == null)
    {
        ErrorMessage resp = new ErrorMessage();
        resp.error = "Parameters are missing";
        return Request.CreateResponse(HttpStatusCode.BadRequest, resp);
    }
    else if (campaign.IsValid())
    {
        Fon_Campaign c = campaign;

        db.Fon_Campaign.Add(c); // Error: An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code, c is considering like an Campaign value and not Fon_Campaign
        db.SaveChanges();
        return Request.CreateResponse(HttpStatusCode.OK, c);
    }
    else
    {
        ErrorMessage resp = new ErrorMessage();
        // Add some explanation
        resp.error = "New campaign is invalid";
        return Request.CreateResponse(HttpStatusCode.BadRequest, resp);
    }
}

当我尝试将对象保存到我的数据库中时,我通知此对象是" Campaign"并且我无法将其放入数据库,因为我必须输入Fon_Campaign,因此演员无法工作。

我的模特

public class Campaign : Fon_Campaign
{
    public bool IsValid()
    {
        return true;
    }
}

希望你能提供帮助,或者给我一些指示,以便找到最佳方法。

1 个答案:

答案 0 :(得分:1)

我假设您首先使用数据库,这就是为什么您不只是在您的课程中添加IsValid。您会注意到Entity Framework生成的类是部分类。

public partial class Fon_Campaign
{
    // generated properties
}

如果您从db更新模型,这些类将被Entity Framework覆盖,因此您可以做的是创建一个新文件夹(让我们说是ExtendedEntities)并自己创建另一个部分类与生成的名称空间和类名相同。现在你可以添加你的" IsValid"那里的方法,它不会被覆盖。

public partial class Fon_Campaign
{
    public bool IsValid()
    {
        return true;
    }
}

第二个永远不会被覆盖。