【问题标题】:What is wrong with my Entity Framework and architecture?我的实体框架和架构有什么问题?
【发布时间】:2019-10-10 08:33:58
【问题描述】:

我正在开发一个任务跟踪器网络应用程序,您可以在此处查看完整代码:https://github.com/KimSergey94/TaskTracker

简而言之,管理员、经理、客户和员工是应用程序的用户,而管理员是这些角色的老板。举例来说,经理可以创建客户收到的任务并将其分配给员工。任务包括状态和状态包括评论。 “角色”将用户 ID 作为存储其电子邮件地址和密码的用户表的外键。角色表存储用户 ID,以便他们拥有正确的角色。

我需要开发基本功能,使用一些 AJAX、自定义过滤器、存储过程。我的授权和角色逻辑有问题。因此,如果您查看并告知我您认为不正确的任何内容,我将不胜感激。

目前,当我尝试启动应用程序并初始化数据库时,出现以下错误:

System.Data.SqlClient.SqlException: 'Introducing FOREIGN KEY constraint 'FK_dbo.Employees_dbo.Users_UserId' on table 'Employees' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

User 和 Employee 类代码:

public class User
    {
        public int UserId { get; set; }
        [DataType(DataType.EmailAddress)]
        [Required]
        public string Email { get; set; }
        public string Password { get; set; }
        public int RoleId { get; set; }

    }
public class Employee
    {
        public int EmployeeId { get; set; }


        //[Required(ErrorMessage = "First Name is required")]
        public string FirstName { get; set; }


        //[Required(ErrorMessage = "Last Name is required")]
        public string LastName { get; set; }

        //[Required(ErrorMessage = "Country field is required")]
        public string Country { get; set; }

        public string Position { get; set; }
        public int Salary { get; set; }

        public int UserId { get; set; }
        [ForeignKey("UserId")]
        public virtual User User { get; set; }

        //public virtual ICollection<Task> Tasks { get; set; }
    }

Globals.asax

protected void Application_Start()
{
    System.Data.Entity.Database.SetInitializer<TaskTrackerContext>(new TaskTrackerDbInitializer());

    var db = new TaskTrackerContext("TaskTrackerContext");
    db.Database.Initialize(true);

    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    ModelValidatorProviders.Providers.Clear();

    NinjectModule orderModule = new OrderModule();
    NinjectModule serviceModule = new ServiceModule("TaskTrackerDb");
    var kernel = new StandardKernel(orderModule, serviceModule);
    DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
}

web.config:

<connectionStrings>
    <add name="TaskTrackerContext" 
         connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename='|DataDirectory|\TaskTrackerContext.mdf';MultipleActiveResultSets=True; Integrated Security=True" 
         providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <!--
    Initial Catalog=FormsAuth;

</appSettings>

顺便问一下,我为什么需要这个Initial Catalog=FormsAuth;

我注意到使用这个参数我无法实例化数据库。 我想为我的模型获得包含功能

【问题讨论】:

标签: asp.net-mvc entity-framework


【解决方案1】:

在 EF Core 中,您应该使用 DeleteBehavior.RestrictDeleteBehavior.SetNull 禁用级联删除,例如在数据库上下文类中,输入一个新方法

protected override void OnModelCreating(ModelBuilder modelBuilder){ 
   modelBuilder.HasOne(x => x.Employee).WithMany().HasForeignKey(x => 
   x.UserId).OnDelete(DeleteBehavior.Restrict) 
}

如果你想要级联行为,你需要给 UserId 添加一个可以为空的整数:

public int? UserId { get; set; }

Initial Catalog=FormsAuth; 来自 System.Web.Security 命名空间,用于表单验证,您可以在 Microsoft Docs 上阅读更多相关信息:https://docs.microsoft.com/en-us/dotnet/api/system.web.security.formsauthentication?view=netframework-4.8

我推荐使用 asp.net 身份,我可以看到很多你在做的事情是重新发明轮子,而 asp.net 为你做身份验证和验证。你可以在这里阅读:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-3.0&tabs=visual-studio

【讨论】:

    【解决方案2】:

    我有一张与其他人有循环关系的表,我遇到了同样的错误。原来这是关于不可为空的外键。如果键不可为空,则必须删除相关对象,并且循环关系不允许这样做。所以使用可以为空的外键。

    public int? UserId { get; }
     [ForeignKey("UserId")]
    public virtual User User { get; set; }
    

    【讨论】:

    • 谢谢!那行得通。现在我正在考虑在需要时启用迁移,但我总是会遇到一些错误......可能我从一开始就没有遵循 Code-First 方法。我的 bl、dl 和 ui 解决方案中有 3 个项目
    • 是否需要启用迁移才能获得包含和最可能的其他功能?还是在我的情况下不需要?
    • 这样做会更容易
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多