C# 具有实体框架的MVC操作异常无效
用户和管理员是1对1的关系,其中只有1个用户的1个管理员角色 以前,我通过在管理员类的第一行添加[Key]来修复ModelValidationException,该行位于此链接之后,但现在我遇到了以下错误: 无法确定服务器之间关联的主体端 类型“RecreationalServicesTicketingSystem.Models.Administrator”和 '娱乐服务SticketingSystem.Models.User'。主端 必须使用 关系流API或数据注释 我试图遵循这个解决方案,但它仍然给了我同样的错误 User.csC# 具有实体框架的MVC操作异常无效,c#,asp.net-mvc,entity-framework,relational-database,C#,Asp.net Mvc,Entity Framework,Relational Database,用户和管理员是1对1的关系,其中只有1个用户的1个管理员角色 以前,我通过在管理员类的第一行添加[Key]来修复ModelValidationException,该行位于此链接之后,但现在我遇到了以下错误: 无法确定服务器之间关联的主体端 类型“RecreationalServicesTicketingSystem.Models.Administrator”和 '娱乐服务SticketingSystem.Models.User'。主端 必须使用 关系流API或数据注释 我试图遵循这个解决方案,但
public class User
{
public int UserID { get; set; }
[StringLength(50, MinimumLength = 1)]
public string LastName { get; set; }
[StringLength(50, MinimumLength = 1, ErrorMessage = "First name cannot be longer than 50 characters.")]
[Column("FirstName")]
public string FirstMidName { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime EnrollmentDate { get; set; }
public int DepotID { get; set; }
public int DepartmentID { get; set; }
public int TicketID { get; set; }
public string FullName
{
get { return LastName + ", " + FirstMidName; }
}
//Setting up relationships A use can apply for any number of tickets, so Tickets is defined as a collection of Ticket entities.
public virtual ICollection<Ticket> Tickets { get; set; }
//Setting up relationships Users can only have ONE adminstrator so we use public virtual Administrator Administrator { get; set; }
public virtual Administrator Administrator { get; set; }
public virtual Department Department { get; set; }
public virtual Depot Depot { get; set; }
}
公共类用户
{
public int UserID{get;set;}
[StringLength(50,最小长度=1)]
公共字符串LastName{get;set;}
[StringLength(50,MinimumLength=1,ErrorMessage=“名字不能超过50个字符)。]
[列(“名字”)]
公共字符串FirstMidName{get;set;}
[数据类型(DataType.Date)]
[DisplayFormat(DataFormatString=“{0:yyyy-MM-dd}”,ApplyFormatInEditMode=true)]
公共日期时间注册日期{get;set;}
public int DepotID{get;set;}
public int DepartmentID{get;set;}
public int TicketID{get;set;}
公共字符串全名
{
获取{return LastName+“,”+FirstMidName;}
}
//设置关系使用可以应用于任意数量的票据,因此票据被定义为票据实体的集合。
公共虚拟ICollection票证{get;set;}
//设置关系用户只能有一个管理员,因此我们使用公共虚拟管理员{get;set;}
公共虚拟管理员管理员{get;set;}
公共虚拟部门部门{get;set;}
公共虚拟仓库{get;set;}
}
Administrator.cs
public class Administrator
{
[Key]
public int AdminID { get; set; }
public int TicketID { get; set; }
public int UserID { get; set; }
[StringLength(50)]
public string AdminRole { get; set; }
public virtual ICollection<Ticket> Tickets { get; set; }
public virtual User User { get; set; }
}
公共类管理员
{
[关键]
public int AdminID{get;set;}
public int TicketID{get;set;}
public int UserID{get;set;}
[长度(50)]
公共字符串AdminRole{get;set;}
公共虚拟ICollection票证{get;set;}
公共虚拟用户用户{get;set;}
}
在configuration.cs中,我为用户和管理员执行迁移
使用者
var用户=新列表
{
新用户{FirstMidName=“lala”,LastName=“la”,
EnrollmentDate=DateTime.Parse(“2016-02-18”)},
新用户{FirstMidName=“baba”,LastName=“baba”,
EnrollmentDate=DateTime.Parse(“2016-02-18”)},
新用户{FirstMidName=“dada”,LastName=“dada”,
EnrollmentDate=DateTime.Parse(“2016-02-18”)},
新用户{FirstMidName=“Christine”,LastName=“West”,
EnrollmentDate=DateTime.Parse(“2016-02-18”)},
};
管理员
var administrator = new List<Administrator>
{
new Administrator {AdminID = 1, AdminRole = "Administrator LVL1", User = users.Single ( s => s.UserID == 1),
Tickets = new List<Ticket>() },
new Administrator {AdminID = 2, AdminRole = "Administrator LVL2", User = users.Single ( s => s.UserID == 2),
Tickets = new List<Ticket>() },
new Administrator {AdminID = 3, AdminRole = "Administrator LVL3", User = users.Single ( s => s.UserID == 3),
Tickets = new List<Ticket>() }
};
administrator.ForEach(s => context.Administrators.AddOrUpdate(p => p.AdminID, s));
context.SaveChanges();
}
var管理员=新列表
{
新管理员{AdminID=1,AdminRole=“Administrator LVL1”,User=users.Single(s=>s.UserID==1),
票证=新列表()},
新管理员{AdminID=2,AdminRole=“Administrator LVL2”,User=users.Single(s=>s.UserID==2),
票证=新列表()},
新管理员{AdminID=3,AdminRole=“Administrator LVL3”,User=users.Single(s=>s.UserID==3),
票证=新列表()}
};
administrator.ForEach(s=>context.Administrators.AddOrUpdate(p=>p.AdminID,s));
SaveChanges();
}
在一对一关系中,实体必须共享相同的主键。因此,删除AdminId
,并将UserId
作为主键。此外,您应该配置关系的主体端,即级联删除应该采取的方向。当用户被删除时,管理员也应该被删除,因此用户应该是负责人。看到了吗?我试着遵循这个解决方案,我不知道你是如何使用这个建议的映射的。@GertArnold我试过了,但删除了它,因为它没有解决我的问题problem@Dabblernl但我需要adminID,因为adminID标识用户是管理员LVL1还是管理员LVL2等?我把[Key,ForeignKey(“User”)]放在公共int-UserID{get;set;}@GertArnold上面,这没有任何意义。
var administrator = new List<Administrator>
{
new Administrator {AdminID = 1, AdminRole = "Administrator LVL1", User = users.Single ( s => s.UserID == 1),
Tickets = new List<Ticket>() },
new Administrator {AdminID = 2, AdminRole = "Administrator LVL2", User = users.Single ( s => s.UserID == 2),
Tickets = new List<Ticket>() },
new Administrator {AdminID = 3, AdminRole = "Administrator LVL3", User = users.Single ( s => s.UserID == 3),
Tickets = new List<Ticket>() }
};
administrator.ForEach(s => context.Administrators.AddOrUpdate(p => p.AdminID, s));
context.SaveChanges();
}