一对一的关系并不起作用

时间:2018-05-05 16:24:45

标签: c# sql entity-framework sqlite

我的实体如下:

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; }
}

我收到以下错误:

  

多重性在角色&#39; Class1_Class2_Target&#39;中无效。在   关系&#39; Class1_Class2&#39;。因为依赖角色属性是   不是关键属性,多重性的上限   依赖角色必须是&#39; *&#39;。

1 个答案:

答案 0 :(得分:1)

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

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

    即可

    data source = C:\ Dbs \ myDb.db; foreign keys = true; (用你的sqlite数据库替换C:\ Dbs \ myDb.db。)

  3. 我更喜欢方法2)