【问题标题】:ASP.NET MVC remove foreign key constraint via fluent APIASP.NET MVC 通过 fluent API 移除外键约束
【发布时间】:2015-07-31 16:58:48
【问题描述】:

我有模特

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

    ....

    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }

    public ApplicationUser UserCreated { get; set; }

    public ApplicationUser UserModified { get; set; }
}

UserCreated 目前我已经配置了与User 表的外键关系。这是我不想要的。

我的 DbMigration 脚本不应该在这些之间创建外键关系,因为我应该能够删除用户,而不必在执行此操作之前实际删除菜单中的所有记录。

这是否可以避免?如果可以,如何避免?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework


    【解决方案1】:

    为了使用UserCreatedUserModified 的导航属性,EF Migrations 需要该外键才能知道如何检索该数据。

    如果我是你,我会删除这两个导航属性并创建一个扩展方法,你可以使用它来获取UserCreatedUserModified。您的代码将类似于以下内容。

    public static class MenuItemExtensions {
      public static ApplicationUser GetUserCreated(this MenuItem menuItem, DbContext db) {
        db.ApplicationUsers.SingleOrDefault(u => u.Username == menuItem.CreatedBy);
      }
    
      public static ApplicationUser GetUserModified(this MenuItem menuItem, DbContext db) {
        db.ApplicationUsers.SingleOrDefault(u => u.Username == menuItem.ModifiedBy );
      }
    }
    

    我假设UsernameCreatedByModifiedBy 对应的名称。

    另外,记得为这些列添加数据库索引,这样连接就不会超级慢!

    【讨论】:

    • 您好,感谢您的意见。不过,我对此很陌生,并且没有经常使用扩展方法。我已经创建了您建议的扩展,但是我将如何在我的控制器中检索这些数据,所以我将它放在我的 ViewModel 中。我似乎无法在任何地方找到 GetUserCreated 方法。希望这个问题不是愚蠢的:S
    • 说你的MenuItem的变量名是menuItem。您只需使用 var username = menuItem.GetUserCreated(db)。你需要坚持使用 XX;在文件顶部指向您的扩展所在的命名空间。
    • 哈哈,我试过了,但是我的命名空间不对,doohhh:>:(
    • 有一点需要注意,如果您在检索 MenuItem 时总是返回 usercreated/usermodified,您可能需要执行一个查询来获取所有信息。目前根据我的建议,您需要查询 3 次。一次用于 MenuItem。一次为 CreatedBy。一次为 ModifiedBy。您需要编写一个在一个复杂的 LINQ 语句中返回 MenuItem、CreatedBy、ModifiedBy 的查询。
    • 是的。目前,如果我需要调用它们,我有扩展。在这种情况下,额外的电话就可以了。如果我决定去别的地方,我已经做了一些 linq 声明。 TY 为您提供帮助。
    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多