实体框架问题 - 在我的表名中附加"1"?

Mat*_*zen 9 c# entity-framework ef-model-first

我有以下模型 - 首先(它是什么叫它?)我做的图.我T4用来生成类.

在此输入图像描述

现在,我遇到一个问题,导致实体框架以某种方式将"1"附加到DatabaseSupporter实体的表名.数据库是从这个模型生成的,没有任何修改过.

我正在尝试执行以下行:

_entities.DatabaseSupporters.SingleOrDefault(s => s.Id == myId);
Run Code Online (Sandbox Code Playgroud)

我执行该行时遇到的错误(以及下面的内部异常)是:

mscorlib.dll中出现"System.Data.Entity.Core.EntityCommandExecutionException"类型的异常,但未在用户代码中处理.

无效的对象名称'dbo.DatabaseSupporter1'.

我尝试使用以下Fluent API代码解决问题(请注意函数中将表明确命名为"DatabaseSupporter"的第二行),但没有运气.

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{

    modelBuilder
        .Entity<DatabaseSupporter>()
        .HasOptional(f => f.DatabaseChatSession)
        .WithOptionalPrincipal(s => s.DatabaseSupporter);

    modelBuilder
        .Entity<DatabaseSupporter>()
        .Map(m =>
        {
            m.Property(s => s.Id)
                .HasColumnName("Id");
            m.ToTable("DatabaseSupporter");
        });

    modelBuilder
        .Entity<DatabaseSupporter>()
        .HasMany(s => s.DatabaseGroups)
        .WithMany(g => g.DatabaseSupporters)
        .Map(m =>
        {
            m.ToTable("DatabaseSupporterDatabaseGroup");
            m.MapLeftKey("DatabaseGroups_Id");
            m.MapRightKey("DatabaseSupporters_Id");
        });

    modelBuilder
        .Entity<DatabaseGroup>()
        .HasRequired(g => g.DatabaseChatProgram)
        .WithMany(c => c.DatabaseGroups);

    modelBuilder
        .Entity<DatabaseGroup>()
        .HasRequired(g => g.DatabaseOwner)
        .WithMany(o => o.DatabaseGroups);

    modelBuilder
        .Entity<DatabaseOwner>()
        .HasMany(o => o.DatabaseChatSessions)
        .WithRequired(o => o.DatabaseOwner);

    base.OnModelCreating(modelBuilder);
}
Run Code Online (Sandbox Code Playgroud)

应该提到的是Id,每个实体的属性实际上是一个Guid.

我正在使用Entity Framework 6.0.2.

有任何想法吗?

编辑1 这是DatabaseSupporter.cs包含我DatabaseSupporter在评论中请求的实体的生成文件.

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Coengage.Data.Entities
{
    using System;
    using System.Collections.Generic;

    public partial class DatabaseSupporter
    {
        public DatabaseSupporter()
        {
            this.DatabaseGroups = new HashSet<DatabaseGroup>();
        }

        public bool IsActive { get; set; }
        public string Username { get; set; }
        public System.Guid Id { get; set; }

        public virtual DatabaseChatSession DatabaseChatSession { get; set; }
        public virtual ICollection<DatabaseGroup> DatabaseGroups { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑2 在我添加DatabaseSupporter和之间的多对多链接后,错误开始出现DatabaseGroup.在该链接之前,也不需要Fluent代码.

Sla*_*uma 10

此映射不正确:

modelBuilder
    .Entity<DatabaseSupporter>()
    .Map(m =>
    {
        m.Property(s => s.Id)
            .HasColumnName("Id");
        m.ToTable("DatabaseSupporter");
    });
Run Code Online (Sandbox Code Playgroud)

它是实体拆分映射的50%- 一种映射,它将单个实体的属性存储在两个(甚至更多)单独的表中,这些表通过数据库中的一对一关系链接.由于映射不完整,您甚至无法获得实体拆分的正确映射.特别是EF似乎假设包含其他属性的第二个表(未在映射片段中明确配置)应具有该名称DatabaseSupporter1.我可以用EF 6重现它(顺便提一下,它添加了一个Property方法来配置映射片段中的单个属性.在早期版本中,该方法不存在(只有Properties方法).)一对一的约束也是在数据库中未正确创建.在我看来,EF应该抛出一个关于不正确映射的异常,而不是毫无例外地将模型静默映射到废话.

无论如何,您可能不希望将实体属性拆分为多个表,而是将其映射到单个表.然后必须通过以下方式替换上面的代码块:

modelBuilder.Entity<DatabaseSupporter>()
    .Property(s => s.Id)
    .HasColumnName("Id");

modelBuilder.Entity<DatabaseSupporter>()
    .ToTable("DatabaseSupporter");
Run Code Online (Sandbox Code Playgroud)

第一个映射似乎是多余的,因为Id默认情况下该属性将映射到具有相同名称的列.第二个映射可能也是多余的(取决于是否打开表名复数).没有这个映射你可以试试.在任何情况下,你不应该再抱一个抱怨失踪的例外dbo.DatabaseSupporter1.