从LINQ迁移到SQL到实体框架“代码优先”

时间:2011-05-09 15:00:54

标签: linq-to-sql entity-framework-4 ef-code-first

由于我已经有了LINQ to SQL数据访问解决方案的类,如果我想将它们迁移到EFCF,我会遇到什么麻烦?因为数据库已经存在,所以我首先要调用此代码。需要说明的是,该应用尚未投入生产,因此如果EFCF消除了数据,那么这并不是真正的损失。

我可以参加下面的课程,只需在EFCF中使用它吗?我应该还是必须删除数据注释属性?

我有EntityRef和EntitySet需要改变什么?

[Table]
public class PlanMember {
    private EntityRef<SystemUser> _caseManager;
    private EntityRef<PlanMemberStatus> _status;

    public PlanMember() {
        this.PlanMemberView = new Views.PlanMember();
    }

    [Column(
        IsPrimaryKey = true,
        IsDbGenerated = true,
        AutoSync = AutoSync.OnInsert
    )]
    public Int64 ID { get; set; }

    [Column]
    public DateTime? BirthDate { get; set; }

    [Column]
    public String City { get; set; }

    [Column]
    public String FirstName { get; set; }

    [Association(ThisKey = "CaseManagerID", Storage = "_caseManager")]
    public SystemUser CaseManager {
        get { return (this._caseManager.Entity); }
        set { this._caseManager.Entity = value; }
    }

    [Column]
    public String CaseManagerID { get; set; }

    [Column]
    public Boolean IsActive { get; set; }

    public Boolean IsEligible {
        get { return (this.PlanMemberView.IsEligible); }
    }

    [Column]
    public String LastName { get; set; }

    [Column]
    public String MedicalRecord { get; set; }

    [Column]
    public String MemberNumber { get; set; }

    [Column(Name = "PCPFullName")]
    public String PrimaryCarePhysicianFullName { get; set; }

    [Association(OtherKey = "PlanMemberID")]
    public Views.PlanMember PlanMemberView { get; set; }

    [Column]
    public Int32 PostalCode { get; set; }

    [Column]
    public String Sex { get; set; }

    [Column]
    public String State { get; set; }

    [Association(ThisKey = "StatusID", Storage = "_status")]
    public PlanMemberStatus Status {
        get { return (this._status.Entity); }
        set { this._status.Entity = value; }
    }

    [Column]
    public Int32 StatusID { get; set; }
}

2 个答案:

答案 0 :(得分:4)

我们将应用程序从Linq迁移到Sql到EF POCO生成但是没有先尝试过代码,因为当时没有编写代码。真的不是非常困难。我们案例中的主要痛点是以下差异:

  • Linq to Sql使用单独的“桥”对象处理多对多关系,EF将这些关系视为各种类型的集合。这会改变许多语义,并且可能导致大量代码发生变化,尤其是当您让实体进入UI时。
  • 另一个痛点是可空和不可空的关系。 Linq to Sql在这里有点宽容,但是为了让EF发挥得很好,我们需要允许一些我们传统上没有的可空列。
  • Linq to Sql和EF数据映射有时会对要映射到的CLR类型有不同的看法。 Xml列是我们的主要痛点,但你可能没有任何这些。
  • 大招/噩梦就是如何在不破坏所有内容的情况下摆脱l2s位,因为linq to sql生成你的实体。

如果没有一套非常有效的单元测试,我会尝试这样做,以便为您提供自动化的基础,为您提供非常规律的温度读数。我们的另一个天赐之物是我们有一个非常可靠的Repository模式实现 - 没有直接与EF / Linq2Sql位进行对话,而是两个实现IRepository的类。基本上,这是对您在实施架构方面的纪律性的一个很好的测试。此外,这是一个你认识到resharper值得每一分钱的场合。

要回答你的一个直接问题,我认为属性不一定重要,但我会删除它们,以免发生任何潜在的混淆和/或名称空间冲突。

答案 1 :(得分:1)

假设您的类的名称与数据库表的名称相同,并且类的属性与数据库列名相匹配,您应该能够删除所有属性并使用与EF代码优先模型相同的类(I不要认为你必须删除属性,但除非你打算继续在Linq2Sql模型中使用它们,否则没有理由保留它们,并且由于迁移中可能会有一些变化,最好删除它们因为你的新实体可能仍然无法在Linq2Sql中工作)。如果您的类与数据库架构不匹配,请Scott Guthrie has a blog post about Entity Framework 4 "Code-First": Custom Database Schema Mapping

  

我有EntityRef和EntitySet需要改变什么?

定义为EntityRef<OtherEntity>的关系可以替换为OtherEntity类型的属性,EntitySet<OtherEntity>可以成为ICollection<OtherEntity>或实现ICollection<T>的任何内容例如IDbSet<OtherEntity>(我相信如果你从现有数据库生成模型,你会得到一个DbSet<T>。)