繁体   English   中英

实体框架6.1代码优先中不需要的外键约束

[英]Unwanted Foreign Key Constraint in Entity Framework 6.1 Code First

我的EF项目在我的模型中有Day类, WeekEnd类和Week类。 我用[InverseProperty][Required]属性标记了这些类:

public class Day
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int DayId { get; set; }

    public DateTime UtcDayStart { get; set; }

    public string DayName { get; set; }

    public int ISOWeekNumber {get; set; }

    [InverseProperty("Days")]
    public virtual Week Week { get; set; }

    [InverseProperty("Days")]
    public virtual WeekEnd WeekEnd { get; set; }
}

public class WeekEnd
{
    Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int WeekEndId { get; set; }

    public DateTime UtcWeekEndStart { get; set; }

    public int ISOWeekNumber { get; set; }

    [Required]
    [InverseProperty("WeekEnd")]
    public virtual Week Week { get; set; }

    [InverseProperty("WeekEnd")]
    public virtual ICollection<Day> Days { get; set; }
}

public class Week
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int WeekId { get; set; }

    public DateTime UtcWeekStart { get; set; }

    public int ISOWeekNumber { get; set; }

    [InverseProperty("Week")]
    public virtual WeekEnd WeekEnd { get; set; }

    [InverseProperty("Week")]
    public virtual ICollection<Day> Days { get; set; }
}

问题是SQL Server不允许我为WeekEnd_WeekEndId插入带Null Day表数据。 而且由于并非一周中的所有日子都属于周末,这对我来说是个问题。

插入语句:

INSERT INTO [database].[dbo].[Days] (DayId, UtcDayStart, ISOWeekNumber,
DayName, WeekEnd_WeekEndId, Week_WeekId)
VALUES ('3', '1/3/2005 12:00 AM', '1', 'Monday', '', '1')

SQL Server错误消息是:

消息547,级别16,状态0,第1行
INSERT语句与FOREIGN KEY约束“ FK_dbo.Days_dbo.WeekEnds_WeekEnd_WeekEndId”冲突。 在数据库“数据库”的表“ dbo.WeekEnds”的列“ WeekEndId”中发生了冲突。

如何设置属性或可能添加一个或多个外键列以使代码优先迁移不会在DaysWeekEnds之间创建该外键约束?

编辑:

因此,在进行了此工作并尝试了不同的FluentAPI语句和属性之后,我认为该模型很好。 是SQL Server INSERT语句不起作用。 如果我这样做:

INSERT INTO [database].[dbo].[Days] (DayId, UtcDayStart, ISOWeekNumber,
DayName, Week_WeekId)
VALUES ('3', '1/3/2005 12:00 AM', '1', 'Monday', '1')

然后在实际上属于WeekEnd那几天进行如下UPDATE

UPDATE [database].[dbo].[Days] SET WeekEnd_WeekEndId = 'X'  WHERE DayId ='Y'

然后,我的表在星期一到星期五之间具有WeekEnd_WeekEndId Null值(如我想要的)。

我不确定这是否可以作为答案,因为我是新来的。 因此,我将让其他人提出答案。

为了将关系配置为0..many而不是1..many ,您将需要调整模型。 最简单的方法是使用FluentAPI。

protected override void OnModelCreating(DbModelBuilder modelBuilder) {

    modelBuilder.Entity<Week>()
                .HasMany<Day>(w => w.Days)
                .WithOptional(d => d.Week);

    modelBuilder.Entity<WeekEnd>()
                .HasMany<Day>(we => we.Days)
                .WithOptional(d => d.WeekEnd);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM