使用现有主详细信息数据库在EF上选择错误

时间:2012-10-24 09:42:17

标签: c# sql entity-framework master-detail

Entity Framework v5看起来很酷,我尝试使用现有 MSSQL(Azure)数据库从Linq-to-SQL切换。 但有关EF的教程太复杂,无法理解。

数据库模式非常简单如下(由现有数据库生成)。

表单 SheetDetails 表以1对多关系连接。

CREATE TABLE [dbo].[Sheets] (
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [Grade]       FLOAT (53)     CONSTRAINT [DF_Sheets_Grade] DEFAULT ((0)) NOT NULL,
    [Title]       NVARCHAR (255) CONSTRAINT [DF_Sheets_Title] DEFAULT ('') NOT NULL,
    [Description] NVARCHAR (255) NULL,
    [Difficulty]  SMALLINT       CONSTRAINT [DF_Sheets_Difficulty] DEFAULT ((0)) NOT NULL,
    [Writer]      NVARCHAR (255) CONSTRAINT [DF_Sheets_Writer] DEFAULT ('') NOT NULL,
    [Tag]         NVARCHAR (255) NULL,
    [Duration]    FLOAT (53)     CONSTRAINT [DF_Sheets_Duration] DEFAULT ((0)) NOT NULL,
    [Timestamp]   DATETIME       CONSTRAINT [DF_Sheets_Timestamp] DEFAULT ((0)) NOT NULL,
    [RowVersion]  ROWVERSION     NOT NULL,
    CONSTRAINT [PK_Sheets] PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[SheetDetails] (
    [Id]                   INT        IDENTITY (1, 1) NOT NULL,
    [Score]                FLOAT (53) CONSTRAINT [DF_SheetDetails_Score] DEFAULT ((0)) NOT NULL,
    [Number]               SMALLINT   CONSTRAINT [DF_SheetDetails_Number] DEFAULT ((0)) NOT NULL,
    [SubNumer]             SMALLINT   NULL,
    [IsRandom]             BIT        CONSTRAINT [DF_SheetDetails_IsRandom] DEFAULT ((0)) NOT NULL,
    [AnswerType]           SMALLINT   CONSTRAINT [DF_SheetDetails_AnswerType] DEFAULT ((0)) NOT NULL,
    [RowVersion]           ROWVERSION NOT NULL,
    [SheetDetail_Sheet]    INT        CONSTRAINT [DF_SheetDetails_SheetDetail_Sheet] DEFAULT ((0)) NOT NULL,
    [SheetDetail_Question] INT        CONSTRAINT [DF_SheetDetails_SheetDetail_Question] DEFAULT ((0)) NOT NULL,
    CONSTRAINT [SheetDetail_Sheet] FOREIGN KEY ([SheetDetail_Sheet]) REFERENCES [dbo].[Sheets] ([Id]) ON DELETE CASCADE
);

请注意,FK名称是SheetDetails表中的SheetDetail_Sheet。

结果图如下。 enter image description here

接下来,我可能需要编写EntityTypeConfiguration。 我把它作为问题1尝试过。

问题1。 我写了模型创建配置如下,但没有运气。这是错的吗?很难知道如何使用这种简单的数据库模型编写正确的配置。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new SheetsConfiguration());
        base.OnModelCreating(modelBuilder);
    }

    public class SheetsConfiguration : EntityTypeConfiguration<Sheets>
    {
        public SheetsConfiguration()
            : base()
        {
            HasKey(p => p.Id);
            Property(p => p.Id).HasColumnName("Id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
            Property(p => p.RowVersion).IsConcurrencyToken().IsRowVersion();
            HasOptional(p => p.SheetDetails).WithMany().Map(x => x.MapKey("SheetDetail_Sheet"));
            ToTable("Sheets");
        }
    }

我使用

执行简单查询
var result = _db.Sheets.Where(sheet => sheet.Id == id).ToList();

然后,我收到错误“无效的列名SheetDetail_Sheet”,执行的查询如下。

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Grade] AS [Grade], 
[Extent1].[Title] AS [Title], 
[Extent1].[Description] AS [Description], 
[Extent1].[Difficulty] AS [Difficulty], 
[Extent1].[Writer] AS [Writer], 
[Extent1].[Tag] AS [Tag], 
[Extent1].[Duration] AS [Duration], 
[Extent1].[Timestamp] AS [Timestamp], 
[Extent1].[RowVersion] AS [RowVersion], 
[Extent1].[SheetDetail_Sheet] AS [SheetDetail_Sheet]
FROM [dbo].[Sheets] AS [Extent1]
WHERE [Extent1].[Id] = @p__linq__0

我可以理解,因为 SheetDetail_Sheet只是一个FK ,并且在edmx属性和数据库列中不存在。 我该如何解决?

我不想编辑自动生成的模型文件,因为它可以被覆盖。也许似乎是用EntityTypeConfiguration实现的。

问题2。 是否有常用的主从数据库模型有用且轻量级的参考?

我很难从现有的数据库开始。 stackoverflow,asp.net,博客等...很多教程,但很难找到像我的情况一样的例子。

谢谢。

1 个答案:

答案 0 :(得分:1)

我建议使用Model First来创建数据库模型(尽管您首先使用数据库)。获取数据库模型的好文章是here。只需忽略MVC内容,并在使用EF5时停止“生成强类型实体类”,这将为您生成POCO类。 Edmx应该为您处理所有FK和属性,您不必担心配置器。