C# Entity Framework Code-First-如何仅使用该外键的 id 添加带有外键的行?

Posted

技术标签:

【中文标题】C# Entity Framework Code-First-如何仅使用该外键的 id 添加带有外键的行?【英文标题】:C# Entity Framework Code-First- How do you add a row with foreign key using just the id of that foreign key? 【发布时间】:2021-06-17 05:21:37 【问题描述】:

如果我有以下类(使用 CodeFirst 实体框架):

public class Notifications

    [Key]
    public int ID  get; set; 
    public virtual ClientDetails Client  get; set; 
    public virtual NotificationTypes NotificationType  get; set; 
    public virtual NotificationFreqs Frequency  get; set; 
    public virtual NotificationStatus Status  get; set; 
    public DateTime SendDate  get; set; 
    public DateTime? SentDate  get; set; 
    public DateTime QueueDate  get; set; 


public class NotificationFreqs

    [Key]
    public int ID  get; set; 
    [MaxLength(25)]
    public string Name  get; set; 


public class NotificationStatus

    [Key]
    public int ID  get; set; 
    [MaxLength(25)]
    public string Status  get; set; 

添加新通知时,最有效的说法是notification.status = 1 是什么? 我是否必须每次都查询数据库才能获得可用的列表?

var notification = new Notifications();

var notificationType = db.NotificationTypes.FirstOrDefault(n => n.ID == notificationTypeId);
var notificationFreq = db.NotificationFreqs.FirstOrDefault(n => n.Name == setting.Value);

notification.NotificationType = notificationType; // Works
notification.Frequency = notificationFreq; // Works
notification.Status = new NotificationStatus  ID = 1 ;  // Obviously doesn't work

我觉得多次访问数据库效率低下,但我确实希望这些值标准化并在数据库中。

有什么建议或者我正在做的NotificationType & Frequency 是唯一的方法吗?

谢谢!

【问题讨论】:

【参考方案1】:

你必须修复你的课程。添加 ID 字段:

public class Notifications

    [Key]
    public int ID  get; set; 
    public virtual ClientDetails Client  get; set; 

    [ForeignKey("NotificationType")]
    public int? Type_ID   get; set; 
    public virtual NotificationTypes NotificationType  get; set; 

    [ForeignKey("Frequency")]
    public int? Frequency_ID  get; set; 
    public virtual NotificationFreqs Frequency  get; set; 

    [ForeignKey("Status")]
    public int? Status_ID  get; set; 
    public virtual NotificationStatus Status  get; set; 

    public DateTime SendDate  get; set; 
    public DateTime? SentDate  get; set; 
    public DateTime QueueDate  get; set; 

在这种情况下:

notification.Type_ID = notificationTypeId; 
notification.Frequency_ID = notificationFreq.ID; 
notification.Status_ID = 1

【讨论】:

这会在数据库中添加另一列吗?通过使用虚拟列,它已经添加了一个名为 Frequency_ID、Status_ID 等的列。 啊,我应该提到我正在做代码优先数据库。 在这种情况下,您必须使用现有的列。我会更新我的答案。 不错!这正是我所需要的,在将它们切换为不可为空(删除?)之后,它也修复了外键设置中的一些问题。谢谢!

以上是关于C# Entity Framework Code-First-如何仅使用该外键的 id 添加带有外键的行?的主要内容,如果未能解决你的问题,请参考以下文章

违反主键Entity Framework Code First

转:Entity Framework 5.0 Code First全面学习

Entity Framework Code First Conventions

使用 Entity Framework 6.1 和 MVC 5 从数据库中使用 Code First 后如何同步模型?

Entity Framework Code-First(23):Entity Framework Power Tools

Entity Framework Code-First(10.2):Entity Mappings