- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 Entity Framework 处理实体之间关系的方式感到非常困惑。我有几个问题。
在一个简单的测试应用程序中,我有一张人物表、一张笔记表和一张图片 Assets 表。
.
public class Person
{
public int ID { get; set; }
public string name { get; set; }
public Picture logo { get; set; }
}
public class Note
{
public int ID { get; set; }
public string Text { get; set; }
public Person Owner { get; set; }
}
public class Picture
{
public int ID { get; set; }
public string Path { get; set; }
public Person Owner { get; set; }
}
当我尝试运行时,出现错误“无法确定类型之间关联的主要端......”。
(如果我删除 Person.logo 字段,编译/运行,然后手动将其添加到 SQL 中,连同 FK 关系,它会按预期 100% 工作......我似乎无法弄清楚如何从 EF 本身设置它)。
你能帮忙解决这个错误吗?我在这里阅读了很多答案,但是,我似乎无法调整它来修复我的错误。
但是,现在我有一对多和多对一(我不认为这被归类为多对多?),我只是不明白如何创建人物对象,其中 FK 是非可以为 null 且 FK 尚不存在。
我找到的一个解决方案是让 person.picture 列可以为空,然后创建一个人,然后创建图片,然后将图片分配给 person 对象......但是,理想情况下我不希望它可以为空。应该总是有一张图片。
最佳答案
向下滚动以获取有关您的澄清的答案。
这里有两种方法可以实现,一种方法是删除 cross reference通过申请导航 1:N .
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public virtual Picture Logo { get; set; }
}
public class Note
{
public int ID { get; set; }
public string Text { get; set; }
}
public class Picture
{
public int ID { get; set; }
public string Path { get; set; }
}
这是一个非常便宜的解决方案,您可能不想要比人更多的笔记或图片...
所以,使用 Data Annotations指示外键是什么,这将保持导航和1:1 .
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public virtual Picture Logo { get; set; }
}
public class Note
{
[Key, ForeignKey("Person")]
public int OwnerID { get; set; }
public string Text { get; set; }
public virtual Person Owner { get; set; }
}
public class Picture
{
[Key, ForeignKey("Person")]
public virtual int OwnerId { get; set; }
public string Path { get; set; }
public virtual Person Owner { get; set; }
}
如您所见,由于 1:1 的关系,图片和笔记将使用相同的 ID。如果你的 key 没有命名为ID,你需要添加一个KeyAttribute ,在这种情况下,我们还添加了 ForeignKeyAttribute .
请注意您应该使用virtual
因此只有在您请求时才加载,如果您只想要人名,您很可能不希望数据库查询图片信息。
Association properties that are marked as
virtual
will by default be lazy-loaded. What this means is that if you retrieve a Product entity, its Category information will not be retrieved from the database until you access its Category property (or unless you explicitly indicate that the Category data should be retrieved when you write your LINQ query to retrieve the Product object).
通过使用 ICollection<T>
返回 1:N 结构进一步构建外键;一旦你找到你喜欢的人 var boss = Person.Find(BossID)
然后您可以访问 boss.Pictures
这将有各种图片。您还可以分配 boss.Logo
成为其中一张照片。
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public virtual Picture Logo { get; set; }
public ICollection<Picture> Pictures { get; set; }
public ICollection<Note> Notes { get; set; }
}
public class Note
{
public int ID { get; set; }
[ForeignKey("Person")]
public int OwnerID { get; set; }
public string Text { get; set; }
public virtual Person Owner { get; set; }
}
public class Picture
{
public int ID { get; set; }
[ForeignKey("Person")]
public virtual int OwnerId { get; set; }
public string Path { get; set; }
public virtual Person Owner { get; set; }
}
关于c# - Entity Framework Code First 关联/FK 问题和假设/默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7638992/
假设我有两张 table ,a和 b : a { pk as int fk as int ... } b { pk as int ... } 我想在查询中加入 a 和 b,如下所示: FRO
我在 MYSQL 数据库的各个表中分配的列数比实际需要的长度要长。所以现在我尝试使它们具有适当的长度。它们是 VARCHAR(64),我想让它们变成 CHAR(36)。这些列涉及外键。这些更改将成为一
这是我的 table : 成员:ID,... 产品:ID,... 我的 Member 表有一些值,如果 Id = 0,则没有,并且我不想添加任何 Id = 0 的成员,所以我尝试运行此脚本: ALTE
这个问题已经有答案了: MySQL Relationships (1 个回答) 已关闭 4 年前。 这个问题可能在其他帖子中得到了回答,但我一直在搜索,但没有找到类似的东西(很有趣): 我使用 Lar
两个表,使用这些脚本创建: create table user_auth ( username varchar(255) NOT NULL, password varchar(255)
如果我添加带有 ON DELETE CASCADE 之类的 FK,我以后会遭受后果吗? 如果不是,我应该为 CakePHP 的 MySQL 中的 FK 使用什么命名约定? 最佳答案 您可以看到布局的命
我有一个类似的问题: How to create foreign key that is also a primary key in MySQL? 但是我的架构似乎与答案匹配,但仍然返回错误“ERRO
我有 2 个实体:PurchaseRequest (PR) 和 PurchasingRequestLineItem (PRLI)。他们遵循典型的关系模式,即 PR 有许多 PRLI。我在 PRLI 上
在尝试通过删除连接(非规范化)来优化物理数据模型时,我选择采用用户可能为 CommEventPurposeType 指定的所有可能值,将它们实现为 中的 BOOLEAN 属性>CommEventPur
我猜这些问题似乎很令人困惑。 库存实体 @Entity @IdClass(InventoryPK.class) public class Inventory { @Id @ManyTo
UNIQUE(col1, col2) 与 FK(col1), FK(col2) 我目前启用了两个索引,并且我不太关心外部关系本身。所以我想知道通过拥有所有这些键,我是否会获得冗余索引以提高读取性能,或
我需要将名为“practice”的列插入到表“cred_insurances”中,该表是一个 FK 引用表“practices” PK “id” 最佳答案 您需要通过在 mysql 提示符下运行以下命
使用 JPA 注释和 hibernate ,我们最近遇到了一个单向单多映射问题,如下所示: @Entity public class FooOrder extends AbstractEntity{
我经常听说在编写测试时不要使用随机数据,这对于大多数数据来说似乎是合理的。 但是,我认为我有可能需要这样做的情况。我正在处理的代码有一些非 AR 模型。例如,用户模型不受数据库表支持,因为我们通过 A
我的情况(简化)如下所示: 表 UNITS 在 UNITS.NAME 上有一个 PK。 (单位名称, varchar(12)) 表 DEPTS 在 DEPTS.NAME 上有一个 PK。 (部门名称,
我已经使用现有数据库的代码优先方法创建了一个 MVC 应用程序。 我注意到我的一个表不需要外键,所以我尝试删除它但我不断收到: The object 'FK_BorrowedProperty_code
为什么我的初始 update-database 失败了,我需要在我的数据库表类中更改什么才能使其正常工作? 当然,我可以将迁移脚本中的onDelete: ReferentialAction.Casca
我的主要目标是获取所有数据的最后更新时间。 详细信息:我有一张 table - 群组 groupId groupName timeUpdated (timestamp - on update) 还有另
作为练习,我正在构建我的第一个 SQL 数据库。我试图为数据库中的所有表创建语句。我想知道是否可以删除任何外键? 我的第二个问题是如何对使用 4 个或更多表的联接的数据库进行查询。 任何答案都将受到赞
我正在尝试在我的 H2 数据库中运行此 mysql 命令。 DB设置为mysql模式。 -- -----------------------------------------------------
我是一名优秀的程序员,十分优秀!