无法使EF与我现有的数据库一起使用

时间:2017-03-24 23:19:51

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

我在我的数据库中有这4个表,我正在尝试检索哪些车队被分配给用户哪个会话是打开的以及所选择的车队。

dbo.UserAccount 
UserID       (PK,uniqueidentifier,not null)
PrimaryFleet (FK,uniqueidentifier,not null) 
SelectedFleet(FK,uniqueidentifier,not null)

UserAccount表有2个FK,它们都指向列dbo.Fleets.OwnerID

dbo.Session
SessionID (PK,uniqueidentifier,not null)
UserID    (FK,uniqueidentifier,not null)

会话表的FK指向dbo.UserAccount.UserID

dbo.UserFleet
UserID    (FK,uniqueidentifier,not null)
OwnerID   (FK,uniqueidentifier,not null)

UserFleet只是一个表格,可以知道哪些车队分配给每个用户,因此它有多对多的关系

dbo.Fleets
OwnerId (PK,uniqueidentifier,not null)
ownerName (nvarchar(255),not null)

我正在尝试使用以下代码。哪个正常工作,除了我的var舰队返回空,我不知道如何告诉实体框架如何通过表UserFleet将dbo.UserAccount与dbo.Fleets联系起来。

if (HttpContext.Session["Session"] == null)
                {
                    return null;
                }
                var response = new getchangesModel();
                var session = new Guid(HttpContext.Session["Session"].ToString());
                using(Dal.DbContext dc = new Dal.DbContext())
                {
                    var SessionSet = dc.Sessions.Where(S => S.SessionID == session).Include(d => d.UserAccount).SingleOrDefault();
                    var SelectedFleet = dc.Fleets.Where(f => f.OwnerId == SessionSet.UserAccount.SelectedFleet).SingleOrDefault(); 
                    var fleets = dc.UserAccounts.Where(u => u.UserID == SessionSet.UserAccount.UserID).Include(f => f.Fleet);  
                }

这是我的模特定义

[Table("Session")]
public class Session
{
    [Key]
    public Guid SessionID { get; set; }
    public Guid UserID { get; set; }
    public virtual UserAccount UserAccount { get; set; }
}
[Table("Fleets")]
public class Fleet
{
    [Key]
    public Guid OwnerId { get; set; }
    public String ownerName { get; set; }
    public virtual ICollection<UserAccount> UserAccount { get; set; }     

}
 [Table("UserAccount")]
 public class UserAccount
{
    [Key]
    [Display(Name="UserID")] 
    public Guid UserID { get; set; }         
    public Guid SelectedFleet {   get; set; }
    public Guid? PrimaryFleet { get; set; }
    public virtual Fleet Fleet { get; set; }
    public virtual ICollection<Session> Session { get; set; }
} 

1 个答案:

答案 0 :(得分:1)

EF不知道哪个列PrimaryFleet或SecondaryFleet与您的属性Feet相关。您可以指定:

modelBuilder.Entity<UserAccount>()
    .HasRequired(a => a.Fleet)
    .WithMany(a => a.UserAccount)
    .HasForeignKey(a => a.SelectedFleet);

modelBuilder.Entity<UserAccount>()
    .HasOptional(a => a.Fleet)
    .WithMany(a => a.UserAccount)
    .HasForeignKey(a => a.PrimaryFleet);

上一个答案。

根据您的数据库设计,表UserAccount和Fleets具有多对多关系(通过UserFleet表)。但是你的类设计意味着UserAccount只能拥有一个Fleet。所以,首先替换

public virtual Fleet Fleet { get; set; }

public virtual ICollection<Fleet> Fleets { get; set; }

并在第二步将以下代码添加到DbContext的OnModelCreating方法中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<UserAccount>()
        .HasMany<Fleet>(s => s.Fleets)
        .WithMany(c => c.UserAccounts) // i renamed your Fleet.UserAccount property to UserAccounts to show that it is collection
        .Map(cs =>
            {
                cs.MapLeftKey("UserID");
                cs.MapRightKey("OwnerID");
                cs.ToTable("UserFleet");
            });

}