gpt4 book ai didi

c# - 如何使用 Entity Framework 4 Code First (POCO) 声明一对一关系

转载 作者:可可西里 更新时间:2023-11-01 08:15:24 26 4
gpt4 key购买 nike

如何使用 Entity Framework 4 Code First (POCO) 声明一对一关系?

我找到了 this question (one-to-one relationships in Entity Framework 4) ,但是答案引用的那篇文章没有用(有一行代码是一对一的关系,但是没有提到如何定义)。

最佳答案

三种方法:

A) 声明两个具有导航属性的类。用 ForeignKey 属性标记其中一个表(从属表)的主键。 EF 从中推断出 1 对 1:

public class AppUser
{
public int Id { get; set; }

public string Username { get; set; }

public OpenIdInfo OpenIdInfo { get; set; }
}

​public class OpenIdInfo
{
[ForeignKey("AppUser")]
public int Id { get; set; }

public string OpenId { get; set; }

public AppUser AppUser { get; set; }
}

http://weblogs.asp.net/manavi/archive/2011/05/01/associations-in-ef-4-1-code-first-part-5-one-to-one-foreign-key-associations.aspx

我没有使用 virtual,你也不应该。*

B) 声明一个带有两个表名的继承层次结构,从而产生 Table-Per-Type 和一个共享的主键。

using System.ComponentModel.DataAnnotations;

[Table("AppUser")]
public class AppUser
{
public int Id { get; set; }

public string Username { get; set; }

public OpenIdInfo OpenIdInfo { get; set; }
}

[Table("AdminUser")]
public class AdminUser : AppUser
{
public bool SuperAdmin { get; set; }
}

您将获得 2 个表:一个用于 AppUser,一个用于 AdminUser。 AdminUser 与 AppUser 是 1:1 并且是从属的 - 这意味着您可以删除 AdminUser,但是如果您在 AdminUser 仍然指向它时删除 AppUser,您将收到约束违规错误。

C) 在 EF 中有 2 种中途做一对一的方法:

Entity-Splitting ,您有一个类,但它存储在一个主表和 1 个或多个一对一相关表中。

Table-Splitting ,其中一棵对象树展平成一个表。例如,具有 Address 属性的类会将 Address 对象的列(如 Address_City)展平到单个表中。

*您可以在任何英孚属性(property)或馆藏中包含虚拟 if you want to lazy-load them .如果您将具有延迟加载属性的对象传递给 MVC JSON 转换器或遍历对象层次结构的任何其他对象,这可能会导致无限循环或加载整个数据库。延迟加载总是同步完成,阻塞线程,并且没有任何通知。总而言之,可以使用它卡住代码、应用程序或服务器的方法列表很长。避免在 EF 类上使用虚拟。是的,互联网上有很多使用它的代码示例。不,你仍然不应该使用它。

关于c# - 如何使用 Entity Framework 4 Code First (POCO) 声明一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3622572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com