首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的实体框架多到多表不自动保存?

问为什么我的实体框架多到多表不自动保存?
EN

Stack Overflow用户
提问于 2017-11-17 04:16:48
回答 1查看 84关注 0票数 0

我要上课,VisitModel和VisitorModel,visitModel可以有很多VisitorModel,反之亦然。在将这两种关系添加到modelBuilder之后,它仍然没有保存到第三个自动生成的表中。它创建了表,但当我尝试保存时,它不会同时保存两个Ids。这是我的代码:

代码语言:javascript
复制
public class VisitorModel
{
    public int VisitorModelId { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateModified { get; set; }
    public bool IsDeleted { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
    public string PhotoUrl { get; set; }
    public string Address { get; set; }
    public int BranchId { get; set; }
    public int UserId { get; set; }
    public virtual User User { get; set; }
    public virtual ICollection<VisitModel> VisitModels { get; set; } 
}

下面是VisitModel类:

代码语言:javascript
复制
public class VisitModel
{
    public VisitModel()
    {
        VisitorModels = new List<VisitorModel>();
    }
    public int VisitModelId { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateModified { get; set; }
    public bool IsDeleted { get; set; }
    public string UserToVisit { get; set; }
    public virtual User User { get; set; }
    public string HostEmail { get; set; }
    public int UserId { get; set; }
    public int VisitorTypeId { get; set; }
    public int PurposeOfVisitId { get; set; }
    public string OtherPurposeOfVisit { get; set; }
    public DateTime ArrivalDate { get; set; }
    public DateTime ArrivalTime { get; set; }
    public DateTime DepartureTime { get; set; }
    public DateTime DepartureDate { get; set; }
    public bool IsCheckedIn { get; set; }
    public bool IsCheckedOut { get; set; }
    public string BookedBy { get; set; }
    public bool IamHost { get; set; }
    public virtual ICollection<VisitorModel> VisitorModels { get; set; }
}

这是modelBuilder:

代码语言:javascript
复制
modelBuilder.Entity<VisitModel>()
    .HasMany(up => up.VisitorModels)
    .WithMany(course => course.VisitModels)
    .Map(mc =>
    {
        mc.ToTable("VisitVisitorModel");
        mc.MapLeftKey("VisitModelId");
        mc.MapRightKey("VisitorModelId");
    });

当我尝试保存时,它不会将两个it都保存到VisitVisitorModel表中。桌子总是空的。拜托,我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-17 13:32:19

因为您遵循了实体框架-多到多公约,所以您不需要使用fluent API部件来设计连接表。

实体框架通过查看类定义就知道,您设计了许多到多个关系。实体框架将为您设计一个合适的连接表。您甚至不应该在您的dbContext中提到这个连接表:

代码语言:javascript
复制
class MyDbContext : DbContext
{
    public DbSet<VisitModel> VisitModels {get; set;}
    public DbSet<VistitorModel> VistiroModels {get; set}
}

但是如果我的连接表没有DbSet,我如何在VisitModel和VisitorModel上进行连接?

答案是:不要使用联接,使用ICollections;

告诉我所有没有被删除的VisitorModels的名字和地址,以及他们今天入住的VisitModels的所有到达时间和起飞时间。

通常,您将加入VisitorModel,在VisitModelId上使用连接表VisitVisitorModel,在VisitorModelId上再次加入VisitModel。

但是您也可以使用ICollectioins:

代码语言:javascript
复制
var result = myDbContext.VisitorModels
    .Where(visitorModel => !visitorModel.IsDeleted)
    .Select(visitorModel => new
    {
        // select only the properties of visitorModel you will be using:
        FullName = visitorModel.FullName,
        Address = visitorModel.Address,
        Phone = visitorModel.Phone,
        ... // other properties

        // get ArrivalTime and DepartureTime of all VisitModels that are checked in
        VisitModels = visitorModel.VisitModels
            .Where(visitModel => visitModel.IsCheckedInd)
            .Select(visitModel => new
            {   // again: select only the properties you will be using:
                ArrivalTime = visitModel.ArrivalTime,
                DepartureTime = visitModel.DepartureTime,
                ... // other properties
            })
            .ToList(),
    }
}

由于适当的多到多配置,您将不需要连接表,也不需要使用主键和外键进行连接。实体框架将知道要进行哪些连接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47343201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档