Linq to sql 从LINQ到SQL再到实体框架的迁移;“代码优先”;

Linq to sql 从LINQ到SQL再到实体框架的迁移;“代码优先”;,linq-to-sql,entity-framework-4,ef-code-first,Linq To Sql,Entity Framework 4,Ef Code First,由于我已经有了用于LINQ到SQL数据访问解决方案的类,如果我想将它们迁移到EFCF,我可能会遇到什么麻烦?我不想先调用这段代码,因为数据库已经存在了。需要说明的是,该应用程序尚未投入生产,因此如果EFCF清除了数据,则不会造成真正的损失 我是否可以使用下面的类并在EFCF中简单地使用它?我应该还是必须删除数据注释属性 在我有EntityRef和EntitySet的地方需要更改什么 [Table] public class PlanMember { private EntityRef&l

由于我已经有了用于LINQ到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; }
}
[表格]
公共类计划成员{
私人实体REF_案例经理;
私有实体ref_状态;
公共计划成员(){
this.PlanMemberView=新视图.PlanMember();
}
[栏目(
IsPrimaryKey=true,
IsDbGenerated=true,
AutoSync=AutoSync.OnInsert
)]
公共Int64 ID{get;set;}
[专栏]
公共日期时间?生日{get;set;}
[专栏]
公共字符串City{get;set;}
[专栏]
公共字符串名{get;set;}
[关联(ThisKey=“CaseManagerID”,Storage=“\u caseManager”)]
公共系统用户案例管理器{
获取{return(this._caseManager.Entity);}
设置{this.\u caseManager.Entity=value;}
}
[专栏]
公共字符串CaseManagerID{get;set;}
[专栏]
公共布尔IsActive{get;set;}
公共布尔不可导{
获取{return(this.PlanMemberView.IsEligible);}
}
[专栏]
公共字符串LastName{get;set;}
[专栏]
公共字符串MedicalRecord{get;set;}
[专栏]
公共字符串MemberNumber{get;set;}
[列(Name=“PCPFullName”)]
公共字符串PrimaryCarePhysicianFullName{get;set;}
[协会(OtherKey=“PlanMemberID”)]
public Views.PlanMember PlanMemberView{get;set;}
[专栏]
公共Int32 PostalCode{get;set;}
[专栏]
公共字符串Sex{get;set;}
[专栏]
公共字符串状态{get;set;}
[关联(ThisKey=“StatusID”,Storage=“\u status”)]
公共计划成员身份{
获取{return(this._status.Entity);}
设置{this.\u status.Entity=value;}
}
[专栏]
公共Int32状态ID{get;set;}
}

我们将一个应用程序从Linq迁移到Sql,再迁移到EF POCO生成,但没有先尝试代码,因为当时它还没有烘焙。这真的不难。我们病例的主要痛点是以下差异:

  • LINQtoSQL使用单独的“桥”对象处理多对多关系,EF将这些关系视为各种类型的集合。这会改变很多语义,并会导致很多代码发生变化,特别是当您让实体进入UI时
  • 另一个痛点是可空和不可空的关系。LINQtoSQL在这里更为宽容,但为了让EF发挥作用,我们需要在一些传统上没有的地方允许可空列
  • Linq到Sql和EF数据映射有时对要映射到的CLR类型有不同的想法。Xml列是我们的主要痛点,但您可能没有这些痛点
  • 最大的诀窍/噩梦是如何在LINQtoSQL生成实体时,在不破坏一切的情况下去掉l2s位
如果没有一组非常有效的单元测试,我不会尝试这样做,因为它可以为您提供一个自动化的基础,让您获得非常定期的温度读数。我们的另一个天赐之物是我们有一个非常可靠的存储库模式实现——除了两个实现IRepository的类之外,没有任何东西可以直接与EF/Linq2Sql位通信。基本上,这是一个很好的测试,测试您在实现体系结构时的纪律性。此外,这是一个你意识到再竖琴是值得每一分钱的时刻


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

假设您的类与数据库表命名相同,并且类的属性与数据库列名匹配,您应该能够删除所有属性,并使用与EF代码优先模型相同的类(我认为您不必删除这些属性,但除非您计划在Linq2Sql模型中继续使用它们,否则没有理由保留它们,而且由于迁移过程中可能会发生一些变化,因此最好删除它们,因为您的新实体可能仍然无法在Linq2Sql中工作)。如果您的类与数据库架构不匹配

在我有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; }
}

定义为
EntityRef
的关系可以替换为类型仅为
OtherEntity
的属性,而
EntitySet
可以成为
ICollection
或实现
ICollection
的任何对象,例如
IDbSet
(我相信,如果从现有数据库生成模型,您将得到一个
DbSet
).

幸运的是,这个应用程序相对简单,不包含太多的M:N关系。你能详细说明一下为什么必须允许EF可以很好地使用空列吗?没有XML类型,至少在LOB区域没有。我也在使用存储库,希望在发布前用WCF将其包装起来。+1用于ReSharper!可能是我的错误前面--旧时代的遗留问题,但是我们在这里避免了int?值,所以我们在引擎盖下设置了一些“null”关系,如“foregin key ID或-1 for null”,这对EF根本不起作用,它希望FK列可以为null。谢谢,这是关于关联的好信息。在EF中似乎简单多了。