В настоящее время я работаю над проектом C # EF MVC в сочетании с базой данных MySql и пытаюсь настроить схему базы данных с помощью подхода, основанного на коде (с включенными миграциями).Для моего примера я упростил свою модель до 3 классов, показанных ниже:
public class Message
{
[Key]
public int MessageId { get; set; }
// Some properties ...
// There will always be one filled in and not the other
public virtual CorrectedContent CorrectedContent { get; set; }
public virtual MessageContent MessageContent { get; set; }
}
public class CorrectedContent
{
[Key]
public int CorrectedContentId { get; set; }
public virtual Message Message { get; set; }
// ...
public MessageContent MessageContent { get; set; } // Nullable
}
public class MessageContent
{
[Key]
public int MessageContentId { get; set; }
public virtual Message Message { get; set; }
public virtual CorrectedContent CorrectedContent
// ...
}
Чтобы убедиться, что отношения были отображены правильно, я также использовал EF Fluent Api на моем DbContext.
public class TestContext: DbContext
{
public TestContext(): base("TestContext") { }
// My DbSets and such ...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<CorrectedContent>()
.HasOptional(x => x.MessageContent)
.WithRequired(y => y.CorrectedContent)
.WillCascadeOnDelete();
modelBuilder.Entity<Message>()
.HasOptional(x => x.MessageContent)
.WithRequired(y => y.Message)
.WillCascadeOnDelete();
modelBuilder.Entity<Message>()
.HasOptional(x => x.CorrectedContent)
.WithRequired(y => y.Message)
.WillCascadeOnDelete();
}
}
У меня возникает проблема, когда я пытаюсь добавить Message
с MessageContent
в свою базу данных, я получаю:
Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется ("DbName "." MessageContent ", ОБЕСПЕЧИВАЕТ" FK_MessageContent_CorrectedContent_MessageContentId "FOREIGN KEY (" MessageContentId ") ССЫЛКИ" CorrectedContent "(" CorrectedContentId ") НА УДАЛИТЬ CASCADE * * *
на 1013 * * * * * *1012* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1012* * * * * * *.«withOptional», но это не сработало, я также пытался работать с обоюдным интерфейсом для
Message
и
CorrectedContent
.
Так что Message
должен иметь один к одному илиНулевое отношение к MessageContent
, CorrectedContent
также имеет отношение один к одному или нулю с MessageContent
, а Message
имеет отношение один к одному или нулю с CorrectedContent
.