在wcf中将数据契约映射到实体框架的实体是昂贵的操作

时间:2014-07-04 04:05:30

标签: c# .net entity-framework wcf

虽然使用带有wcf的EF遇到了我需要将实体映射到数据协定的情况,反之亦然,因为EF对象背负着EF提供的其他数据。因此尝试了很少的映射函数。

[DataContract]
public class WebsitesD
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string Domain { get; set; }
    [DataMember]
    public string UserId { get; set; }
    [DataMember]
    public string Title { get; set; }
}

private WebsitesD mapWebsite(Website w)
    {
        WebsitesD wd = new WebsitesD();
        wd.Id = w.Id;
        wd.Title = w.Title;
        wd.UserId = w.UserId;
        wd.Domain = w.Domain;
        return wd;
    }
  public int insertWebsite(WebsitesD d)
    {
        try
        {
            using (MyInfoEntities entities = new MyInfoEntities())
            {
                entities.Websites.Add(mapWebsite(d));
                entities.SaveChanges();
                return 1;
            }

        }
        catch (Exception e)
        {
            throw e;
        }
    }

其中WebsitesD是我的数据合同,网站是实体对象。有了这个,我可以实现我的目标,但问题是,每当我需要执行任何数据库操作,我需要做映射,我认为可能是昂贵的操作。

我应该离开实体框架并使用ADO .net,因为我不需要在那里进行任何映射。请建议我应该采取哪种方法的利弊。

3 个答案:

答案 0 :(得分:0)

与任何ORM一样,性能和开发人员生产力之间存在权衡。正如您所说,ADO.NET将是从datareader / dataset填充数据合同的最快方法,使用EF / NHibernate,您将始终遇到这种情况。但是,对于独立实体,映射并不昂贵,当您映射实体列表时它会变得很昂贵。如果您根本不需要映射,您还可以将[DataContract]放在实体类上,并将[DataMember]放在要发送给客户端的成员上。但是当您的架构发生变化时自动生成EF代码时,就会全部消失。 您也可以选择EF Code First approach.

另一种涉及较少编码映射的方法是使用AutoMapper Check this out

ORM权衡here

也有很好的线索

答案 1 :(得分:0)

为代码库做最好的事情。考虑可维护性和生产力。服务器很便宜而且开发人员很贵。世界上很少有公司规模如此之大,以至于值得维护更复杂的代码,而不是购买另一台服务器。

答案 2 :(得分:0)

使用EF 6,您可以使用代码生成项 EF 6.x DbContext Generator和WCF支持。

只需右键单击EDMX的设计者,然后转到添加代码生成项...

点击左侧的在线,然后搜索 DbContext。

EF 6.x DbContext Generator with WCF Support

使用此功能将自动生成类中的 DataMember DataContract 属性。 此外,您可能希望删除使用edmx生成的常规模板,或者您将拥有两组实体。