我试图将EF配置为在检索用户或产品时包含文档。实体文档有一个ReferenceId属性,该属性应存储UserId或ProductId。这样,当我为用户或产品保存文档时,UserId或ProductId将保存为document.referenceID。
实体:
public class User { public string Id { get; set; } public ICollection<Document> Documents { get; set; } } public class Product { public string Id { get; set; } public ICollection<Document> Documents { get; set; } } public class Document { public string Id { get; set; } public string ReferenceId { get; set; } }
正在配置:
builder.Entity<User>(e => { e.HasKey(e => e.Id); e.Property(p => p.Id).ValueGeneratedOnAdd(); e.HasMany(e => e.Documents) .WithOne() .OnDelete(DeleteBehavior.Cascade); }); builder.Entity<Product>(e => { e.HasKey(e => e.Id); e.Property(p => p.Id).ValueGeneratedOnAdd(); e.HasMany(e => e.Documents) .WithOne() .OnDelete(DeleteBehavior.Cascade); }); builder.Entity<Document>(e => { e.HasKey(e => e.Id); e.Property(p => p.Id).ValueGeneratedOnAdd(); e.ToTable("Documents"); });
保存:
var user = new User { }; var userDocument = new Document { ReferenceId = user.Id }; var product = new Product { }; var productDocument = new Document { ReferenceId = product.Id }; _context.Users.Add(user); _context.Products.Add(product); _context.Add(userDocument); _context.Add(productDocument); _context.SaveChanges();
迁移:
migrationBuilder.CreateTable( name: "Documents", columns: table => new { Id = table.Column<string>(nullable: false), ReferenceId = table.Column<string>(nullable: true), ProductId = table.Column<string>(nullable: true), UserId = table.Column<string>(nullable: true) }, constraints: table => { table.PrimaryKey("PK_Documents", x => x.Id); table.ForeignKey( name: "FK_Documents_Products_ProductId", column: x => x.ProductId, principalTable: "Products", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_Documents_Users_UserId", column: x => x.UserId, principalTable: "Users", principalColumn: "Id", onDelete: ReferentialAction.Cascade); });
我不希望在Documents表上创建2个外键(ProductId和UserId)。有没有办法让EF自动将UserId和ProductId链接到referenceid?
您可以创建多对多表:
public class Product
{
public string Id { get; set; }
public ICollection<ProductDocument> ProductDocuments{ get; set; }
}
public class Document
{
public string ReferenceId { get; set; }
}
public class ProductDocument
{
public ICollection<Product> Products{ get; set; }
public ICollection<Document> Documents { get; set; }
}
您必须使用相同的模式为用户表ieUserDocumentes
创建一个单独的表。
解决这个问题的正确方法是让User和Product继承一个基类,并将Id和Documents属性移到该类中。
public class BaseObject
{
public string Id { get; set; }
public ICollection<Document> Documents { get; set; }
}
public class User : BaseObject
{
}
public class Product : BaseObject
{
}
public class Document
{
public string BaseObjectId { get; set; }
}
一开始我尝试过,如下所示,但仍然没有结果: 将两个外键定义为实体框架中的主键 实体框架两个外键作为主键 这是我的实体: 我正在尝试基于两个外键创建主键。有一个错误 EntityType“Passage”未定义键。定义此EntityType的键。 我做错了什么?
我试图在laravel中创建一个主键-外键关系,但我一直遇到这个错误 我似乎找不到哪里出错了,因为我在查看了SO上的其他答案后,对模式进行了更改。 当我运行时,上面的错误会弹出,这是一个部分迁移。 任何指向这将是真棒,因为我已经寻找了一段时间的解决方案! 谢谢 员工表 部门表 工资表 新增:DB播种机。 根据评论更改了DB种子程序
问题内容: 是否可以在不使用JPA在数据库中创建外键的情况下建立ManyToOne关联? 这些表由另一个系统拥有,并异步填充。因此,数据库中不能有FK。几乎总是,最终还是有联系。 问题是,即使ConstraintMode.NO_CONSTRAINT,JPA SchemaUpdate也会尝试添加FK。 [错误] ohthSchemaUpdate-无法添加外键约束 如果它没有使其余语句失败,我们可以忽
问题内容: 如何创建外键 从表tGeoAnswers列’locationId’ 表tLocations列“ ID”? 我正在尝试找到的这段代码,但出现以下错误: “ FK_Answer_Location”列的定义必须包含数据类型 问题答案: 否则,假设您要添加名为的列。
问题内容: 为简化起见,我有两个使用外键一对一关联的表,例如: 一个用户可能有很多动作,也可能没有。我需要一个sql select来返回在actions表中没有user_id值的用户id。 所以我需要一个返回用户ID 2(Smith)的SQL查询,因为外键值不包含ID 2 我尝试了以下SQL,但它返回了所有用户ID: 问题答案:
问题内容: 由于已经暗示了该关系,因此我不想在db中创建约束。我该怎么办? 目前,我在进行Alembic迁移后手动删除这些约束。 问题答案: 无需定义“模式”级别约束,而是创建自定义的外部条件;将您要用作“外键”的列以及传递给。您必须手动定义原因,因为: 默认情况下,此值是基于父表和子表(或关联表)的外键关系计算的。 外键也可以在using中内联注释: 您可以验证没有为表 c 发出约束: 警告:
我们系统的所有用户都来自一个主“用户”类。同样,我们希望以相同的方式构造数据库,拥有一个主“用户”表,该表与特定用户类型的必要表连接,以提供额外的用户信息。 以这三个基本表格为例: 表用户 user_id|user_email|user_firstname|user_lastname|... 表雇员 user_id|employee_staff_number|... 表管理 user_id|adm
我正在为Django管理员设置: model.py 在admin.py 对此,我得到了以下错误: (admin. E202)“磁盘。文件”没有“磁盘。设置”的外键 根据https://docs . django project . com/en/dev/ref/models/fields/# django . db . models . foreign key中的文档,它应该可以工作。 我做了一些