После нескольких часов проб и ошибок я добрался до этого thread, в котором объясняется, как установить One- To-Many и отношения «один-к-одному» с теми же двумя типами.Entity Framework 5.0b2 Первый код: один-ко-многим и один-к-одному для одной и той же таблицы WITH WITH Cascade Delete
Однако, я не могу получить эту работу с Cascade Delete:
Метательные:. «Невозможно определить правильный порядок для зависимых операций Зависимости может существовать из-за ограничения внешнего ключа, требование модели, или хранящиеся в хранилищах значения ". (System.Data.UpdateException) Сообщение об исключении = «Невозможно определить действительный порядок для зависимых операций. Зависимости могут существовать из-за для ограничений внешнего ключа, требований к модели или генерируемых магазином значений .», Тип исключения = «Система .Data.UpdateException "
Это происходит только в том случае, если я не отменяю соотношение 1: 1 (см. Код ниже), что, я думаю, имеет смысл, если оно создаст неверную ссылку. Мне просто интересно, есть ли лучший способ представить это.
Пример кода:
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new DropCreateDatabaseAlways<Context>());
using (var ctx = new Context())
{
var user = new User();
ctx.Users.Add(user);
ctx.SaveChanges();
var source = new PaymentSource();
user.PaymentSources = new Collection<PaymentSource>();
user.PaymentSources.Add(source);
user.DefaultPaymentSource = source;
ctx.SaveChanges();
// if I don't do this, I get ordering exception
user.DefaultPaymentSource = null;
ctx.SaveChanges();
ctx.Users.Remove(user);
ctx.SaveChanges();
Assert.Equal(0, ctx.Users.Count());
Assert.Equal(0, ctx.PaymentSources.Count());
}
}
}
public class User
{
public int Id { get; set; }
public virtual ICollection<PaymentSource> PaymentSources { get; set; }
public virtual PaymentSource DefaultPaymentSource { get; set; }
public int? DefaultPaymentSourceId { get; set; }
}
public class PaymentSource
{
public int Id { get; set; }
public virtual User User { get; set; }
public int UserId { get; set; }
}
public class Context : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<PaymentSource> PaymentSources { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>()
.HasOptional(u => u.DefaultPaymentSource)
.WithMany()
.HasForeignKey(u => u.DefaultPaymentSourceId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<PaymentSource>()
.HasRequired(p => p.User)
.WithMany(p => p.PaymentSources)
.HasForeignKey(p => p.UserId)
.WillCascadeOnDelete();
}
}
Не могли бы вы объяснить две таблицы, которые нуждаются в соотношении 1-1 и 1- *? более конкретно: предполагается ли абстракция древовидной структуры? –
Я думал, что модель не требует пояснений, но, я думаю, нет. Ну, «Пользователь» имеет N 'PaymentSource's (1: N), а также сохраняет значение по умолчанию (1: 1, 0: 1 - строгий.) – georgiosd