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.