【发布时间】:2014-02-20 12:12:52
【问题描述】:
我制作了以下模型优先(这就是它的名称吗?)图表。我使用T4 来生成类。
现在,我遇到了一个问题,导致实体框架以某种方式将“1”附加到DatabaseSupporter 实体的表名。数据库就是从这个模型生成的,没有任何修改。
我正在尝试执行以下行:
_entities.DatabaseSupporters.SingleOrDefault(s => s.Id == myId);
执行该行时收到的错误(以及下面的内部异常)是:
类型异常 'System.Data.Entity.Core.EntityCommandExecutionException' 发生在 mscorlib.dll 但未在用户代码中处理。
无效的对象名称“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);
}
应该提到的是,每个实体的Id 属性实际上是一个Guid。
我正在使用实体框架 6.0.2。
有什么想法吗?
编辑 1
这是生成的 DatabaseSupporter.cs 文件,其中包含我在 cmets 中请求的 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; }
}
}
编辑 2
在我添加DatabaseSupporter 和DatabaseGroup 之间的多对多链接后,错误开始出现。在该链接之前,也不需要 Fluent 代码。
【问题讨论】:
-
我之前没有使用
T4生成任何类,因为我创建了所有类,然后让实体框架创建数据库(代码优先)。你能发布你的POCO类或T4一代背后的方法吗?尝试使用 fluent API 更改表名将无法正常工作,因为它的类是错误的。 -
我使用的是默认的 T4 模板。实体框架为我生成类,但它使用的是 T4。关键是 T4 模板没有被修改。
-
它是否创建了一个您可以查看/发布的 POCO 类?
-
那个文件看起来很正常。我不太清楚为什么这是一个部分课程......我的想法已经不多了。
Invalid object name 'dbo.DatabaseSupporter1'表明它正在寻找一个真正的数据库,或者至少 web.config 或 app.config 正在寻找它。我会执行 Ctrl+F 并查看“dbo.DatabaseSupporter1”是否在代码中。如果没有,假设您使用 SQL Server,请检查 SQL Express 没有现有数据库。除此之外,我不认为我可以帮助交配。祝你好运。 -
添加多对多关系后是否重新生成数据库?为了处理多对多关系,我相信如果没有在模型中显式创建一个关系表,Entity 会创建一个关系表。那可能是在其名称后附加 1 引用的表。
标签: c# entity-framework ef-model-first