【发布时间】:2018-05-31 00:12:56
【问题描述】:
我有以下情况:
- 我有几个帐户和几个游戏桌。
- 每个游戏桌都有一个创建者。
- 每个帐户都可以坐在一张桌子上(但不是必须)。
我的模型类如下所示:
public class GameTable
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id
{
get;
set;
}
[Required]
public string Name { get; set; }
[Required]
public string Description { get; set; }
public Guid CreatorId { get; set; }
[ForeignKey(nameof(CreatorId))]
public Account Creator { get; set; }
}
public class Account
{
public Account()
{
Elo = 1000;
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
[MaxLength(15)]
[MinLength(4)]
public string Name { get; set; }
[Required]
[MaxLength(32)]
[MinLength(32)]
public string PasswordHash { get; set; }
public int Elo { get; set; }
public bool IsAdmin { get; set; }
public Guid? CurrentTableId { get; set; }
[ForeignKey(nameof(CurrentTableId))]
public virtual GameTable CurrentTable { get; set; }
}
我的上下文目前看起来像这样:
[Export(typeof(MyDbContext)), PartCreationPolicy(CreationPolicy.Shared)]
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MyDbContext : DbContext
{
public MyDbContext() : base("DbContextCon")
{
Database.SetInitializer<PiksenDbContext>(new CreateDatabaseIfNotExists<PiksenDbContext>());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
public virtual DbSet<Account> Accounts { get; set; }
public virtual DbSet<SecurityToken> SecurityTokens { get; set; }
public virtual DbSet<GameTable> GameTables { get; set; }
}
不幸的是,它不适用于像这样设置的两个外键。以下消息目前让我有些头疼:
System.InvalidOperationException: '无法确定主体 类型“namespace.GameTable”和 '命名空间.帐户'。该关联的主体端必须是 使用关系流式 API 或数据显式配置 注释。'
但是,当我注释掉其中一个 FK 关系时,一切都很好。这两者之间似乎存在某种冲突。
我试图得到的结果是Account 中的一个可空FK 称为CurrentTableId 和GameTable 中的一个不可空FK 称为CreatorId。
【问题讨论】:
-
据我所知,WithRequiredPrinciple() 等不能使用 Data annotations,您必须使用 Fluent API 配置关系。
-
@DevilSuichiro 不幸的是,即使两个 guid 都可以为空并且两个导航属性都是虚拟的,它仍然给我这个错误。
-
延迟加载的能力和列的必需/可选参数在主体/依赖帐户中无关紧要。在 0..1 到 0..1 关系(或介于两者之间的任何位置)中,您需要配置在创建的 SQL 语句中首先插入和最后删除的关系的主体端。这是导致此错误的原因,它与导航属性的“状态”无关。
标签: c# mysql entity-framework ef-code-first