1

我正在使用 EF CodeFirst 生成相当大的模式,包括 TPT 表,例如

[Table("MissingReplacementDongles")]
public class MissingReplacementDongle : ReplacementRentalDongle
{
    public virtual bool OriginalStolen { get; set; }
}

public abstract class ReplacementRentalDongle : ConsequentialRentalDongle
{
    public virtual Money ReplacementCharged { get; set; }
}

[Table("ConsequentialRentalDongles")]
public abstract class ConsequentialRentalDongle : RentalDongle
{
}

[Table("RentalDongles")]
public abstract class RentalDongle : BaseConstraint
{
    public virtual DateTime CurrentExpirationDate { get; set; }

    public virtual DateTime? ReturnedDate { get; set; }
}

我一直在针对 SQL Server Express 2008 安装进行开发,这可以完美地生成表,即带有 ReplacementCharged_Id 列的 ReplacementRentalDongles 表,它引用了 Money 表。

但是,当我运行相同的代码,但使用 SQL Server 2008R2 Developer 实例时,生成的表是不同的!在这种情况下,ReplacementCharged_Id 列最终会在“基本”表 BaseConstraint 中生成。

这是 EF 4.3.1 中的错误,因为不同的 SQL Server 版本最终会创建不同的架构?EF 是否与 SQL 2008R2 兼容?

4

1 回答 1

0

只是为了让大家知道我设法解决了这个问题 - 只需升级到 Entity Framework 5.0(仅在两周前发布 - http://blogs.msdn.com/b/adonet/archive/2012/08/15/ ef5-released.aspx )

EF 5.0 实现了在 .NET 4.5 上运行时可用的新功能(我们不是,我们在 .NET 4.0 上)。但是,EF 5 确实也可以在 .NET 4 上运行,当在 .NET 4 上运行时,它实际上似乎也是 EF 4.3.1 的错误修复的汇总。

短版 - 将 EF DLL 升级到 5.0(通过 NuGet),现在为 SQL 2008 Express 和 2008R2 上的新数据库生成相同(正确!)架构,效果很好!

一个小警告 - 我必须使用额外的using指令更新我的源代码,因为[Table], [InverseProperty]etc 属性已被移动到System.ComponentModel.DataAnnotations.Schema命名空间中(它们System.ComponentModel.DataAnnotations在 EF 4.3.1 的命名空间中)

简单的解决方案 - 只需升级!

于 2012-08-28T09:22:24.767 回答