实体框架+具有重复项的组合键

本文关键字:组合 框架 实体 | 更新日期: 2023-09-27 18:01:12

我正在尝试使用带有实体框架的代码优先模型将矩阵存储在数据库中。我为矩阵中的每个元素创建了一个对象。我希望能够同时搜索行和列,所以我希望将我的RowIDColID都作为Key。使用复合密钥我仍然得到错误:

"Trojan.Models.Matrix_Element::EntityType'Matrix_Etem'未定义键。请定义此EntityType的键。

default_Matrix:EntityType:EntitySet"default_Matrix"基于未定义键的类型"Matrix_Element"。">

我猜这是因为RowIDColID有重复的值。它是一个矩阵,所以每对(RowID, ColID)都是唯一的,但我猜,因为每行有多个条目,每列有多个条目的缘故,它认为存在具有相同PK的元素

有没有办法只通过一对钥匙来识别一个元素?还是我被迫创建一个ElementID属性并将其用作PK?

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Trojan.Models
{
    public class Matrix_Element
    {
        [Key, Column(Order = 0)]
        public int RowID;
        [Key, Column(Order = 1)]
        public int ColID;
        public int? cellValue;
        public string R;
    }
}

实体框架+具有重复项的组合键

您需要使用属性而不是字段。把你的课改成这个。。。。

public class Matrix_Element
{
    [Key, Column(Order = 0)]
    public int RowID { get; set; }
    [Key, Column(Order = 1)]
    public int ColID { get; set; }
    public int? cellValue { get; set; }
    public string R { get; set; }
}

你会得到这样的迁移:

public override void Up()
{
    CreateTable(
        "dbo.Matrix_Element",
        c => new
            {
                RowID = c.Int(nullable: false),
                ColID = c.Int(nullable: false),
                cellValue = c.Int(),
                R = c.String(),
            })
        .PrimaryKey(t => new { t.RowID, t.ColID });//Success!
}