2011-05-09 111 views
2

由于我已经有我的LINQ to SQL数据访问解决方案的类,如果我想将它们迁移到EFCF,可能遇到什么麻烦?由于数据库已经存在,我不愿意先调用这些代码。要清楚的是,该应用程序尚未投入生产,因此如果EFCF清除数据,这并不是真正的损失。从LINQ到SQL到实体框架的迁移“代码优先”

我可以参加一个如下的课程,只是在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; } 
} 

回答

4

我们迁移从LINQ的应用程序的SQL EF POCO一代,但首先因为它是当时没有出炉还没有尝试过的代码。真的不是很难。在我们的案例中,主要的难点在于以下不同:

  • Linq to Sql使用单独的“桥”对象处理多对多关系,EF将这些关系视为各种排序的集合。这改变了很多语义,并且可能导致很多代码改变,特别是如果让实体进入UI。
  • 另一个痛点是可以为空和不可空的关系。 Linq to Sql在这里有点宽容,但是为了让EF发挥出色,我们需要允许可空列(Nullable Column),这是我们传统上没有的地方。
  • Linq to Sql和EF数据映射有时对映射到的CLR类型有不同的想法。 Xml专栏是我们的主要难点,但您可能没有任何这些。
  • 大招/噩梦是如何让没有打破一切可怕的LINQ to SQL中生成的实体,摆脱L2S位。

这不是我想尝试没有一套非常有效的单元测试,给你一个自动化的基础,给你非常常规的温度读数。我们的另一个天赐之物是我们有一个非常稳定的Repository模式实现 - 没有什么是直接与EF/Linq2Sql位对话的,而是两个实现IRepository的类。基本上,这是一个很好的测试,你是如何严格执行你的架构。此外,这是一个当你意识到resharper值得每一分钱的场合。

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

+0

幸运的是,这个应用程序相对简单,并且不包含许多M:N关系。你能否详细说明为什么你必须允许EF可以使用空列来很好地播放?没有XML类型,至少不在LOB区域。我也在使用存储库,希望在发布之前用WCF包装它。还为ReSharper +1! – Yuck 2011-05-09 15:23:11

+0

可能是我前面的错误 - 从过去的宿醉,但我们避免int?值,所以我们设置了一些“可空”关系作为“foregin key ID或-1为null”,但根本不能用EF工作,它期望FK列可以为空。 – 2011-05-09 15:37:07

1

假设你的类的名称相同,数据库中的表,和你的类的属性相匹配的数据库列名,你应该能够删除所有的属性,并使用这些相同的类作为您的EF代码优先模式(我不认为你必须删除的属性,但除非你打算继续在LINQ2SQL模型中使用它们,没有理由让他们,因为有些事情会在迁移可能会改变,它很可能是最好删除他们因为你的新实体可能还不能在Linq2Sql中工作)。如果你的类不符合你的数据库模式,Scott Guthrie has a blog post about Entity Framework 4 "Code-First": Custom Database Schema Mapping

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

定义为EntityRef<OtherEntity>一个关系可以用一个属性来代替只需键入OtherEntityEntitySet<OtherEntity>可以成为ICollection<OtherEntity>或任何实现ICollection<T>IDbSet<OtherEntity>(我相信DbSet<T>是你会得到什么,如果你正在从现有数据库中生成模型)。

+0

谢谢,这是关于协会的好信息。在EF中似乎很简单。 – Yuck 2011-05-09 15:45:36

相关问题