【问题标题】:One to zero-one relationship doesn't work一对零一关系不起作用
【发布时间】:2018-05-05 16:24:45
【问题描述】:

我的实体如下:

public class Class1
{
    public int Id { get; set; }
    [StringLength(50)]
    public string Name { get; set; }
    public virtual Class2 Class2{ get; set; }
}

public class Class2
{
    [ForeignKey("Class1")]
    public int Id { get; set; }
    public int? Price { get; set; }
    public virtual Class1 Class1{ get; set; }
}

我需要 SQLite-Code-First 中这两个实体之间的一对零关系。所以我使用了以下代码:

modelBuilder.Entity<Class1>()
            .HasOptional(s => s.Class2)
            .WithRequired(c => c.Class1);

但不幸的是,这似乎不起作用。我应该无法在Class2 表中插入一个 ID,如果它的等效项尚未插入 Class1,但我可以。有人可以帮我吗?

如果我将 Class2's Id 的命名更改为其他名称,例如Class1Id 像这样:

public class Class2
{
    public int Id { get; set; }
    [ForeignKey("Class1")]
    public int Class1Id { get; set; }
    public int? X { get; set; }
    public int? Y { get; set; }
    public virtual Entity Entity { get; set; }
}

我收到以下错误:

多重性在角色“Class1_Class2_Target”中无效 关系“Class1_Class2”。因为从属角色属性是 不是关键属性,多重性的上限 从属角色必须是“*”。

【问题讨论】:

  • 也许您可以尝试检查您提到的成功插入的Class2的“Id”值是多少?真的是一开始就引用 Class1 吗?
  • @DriLLFreAK100 我已经尝试在 SQLite DB 中自定义插入数据。
  • 如果是这种情况,可能是Class2的Id是自己的主键,而不是指向Class1的foreignKey。尝试将 Class2 的 Id 的命名更改为其他名称,例如Class1Id 试试看。
  • 只要我rmb实体框架对关键字Id敏感,除非明确配置,否则会将其作为类的主键
  • @DriLLFreAK100 我已经尝试过您的建议,正如您在我更新的问题中看到的那样,但我收到了我提到的错误。

标签: c# sql entity-framework sqlite


【解决方案1】:

您的 SQL 是 Sqlite。
尽管您使用的是 EF,但默认情况下 Sqlite 不支持外键。 您应该明确启用支持外键。

  1. 打开编译指示:PRAGMA foreign_keys = ON; 您可以像执行任何其他 SQL 语句一样执行它。注意:您应该为每个新连接执行它
  2. 只需更改连接字符串

    数据源=C:\Dbs\myDb.db;外键=true; (将 C:\Dbs\myDb.db 替换为您的 sqlite 数据库)。

我更喜欢方法 2)

【讨论】:

  • 通过使用第二种方法,它现在在 .NET 中运行良好。但是当我在数据库中尝试时,我仍然遇到问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 2016-09-07
  • 2014-05-11
  • 2020-03-14
相关资源
最近更新 更多