Entity Framework 6 du Code de la première: Comment la graine de données avec un 'circulaire' relation et générées par les magasins colonnes?

Je suis nouveau à l'EF Premier Code, et je suis en train de semences de ma base de données avec des données à l'aide de code-première migrations. J'ai réussi à résoudre plusieurs erreurs jusqu'à présent, mais maintenant je suis coincé et n'ont pas été en mesure de trouver la réponse. J'ai deux problèmes lors de la mise à jour de la base de données à partir de mon code.

J'ai plusieurs objets qui ont de diverses plusieurs-à-plusieurs et un-à-un les relations, et certains ont fini par créer un cercle. Je ne suis pas sûr si cela est la cause du second problème ou pas, quand j'ai essayer de semer la base de données.

  1. La première erreur que j'ai est: A dependent property in a ReferentialConstraint is mapped to a store-generated column. Column: 'LicenseId'.

Est-il une manière que je peux utiliser une db id généré une clé étrangère? Est juste l'ordre dans lequel je suis création/insertion d'objets? (voir l'ensemencement de code ci-dessous)

Si je n'utilise pas [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] dans la Licence, j'obtiens une erreur de ne pas pouvoir implicitement insérer un id qui n'est pas généré par la base de données.

public class License : Entity
{
    [Key, ForeignKey("Customer")]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int LicenseId { get; set; }

    [Required(ErrorMessage = "Date Created name is required")]
    public DateTime DateCreated { get; set; }

    public virtual ICollection<ProductLicense> ProductLicenses { get; set; } //one License has many ProductLicenses
    public virtual Customer Customer { get; set; } //one Customer has one License
}

public class Customer : Entity
{
    [Key]
    public int CustomerId { get; set;}

    [Required(ErrorMessage = "Username is required")]
    [Column(TypeName = "nvarchar")]
    [MaxLength(500)]
    public string Name { get; set; }

    public virtual ICollection<User> Users { get; set; } //one Customer has many users
    public virtual License License { get; set; } //one Customer has one License
    //public virtual ICollection<License> License { get; set; } //one Customer has many Licenses
}
  1. Si je change la Licence à la Clientèle-être plusieurs-à-plusieurs relations (dont je ne veux pas), je reçois le message d'erreur suivant: Cannot insert duplicate key row in object 'dbo.Users' with unique index 'IX_Username'.

Ce sont tous mes relations:

Customer -many-> User -many-> Role -many-> Permission -one- ProductLicense <-many- License -one- Customer

Voici le code que j'ai utilisé dans protected override void Seed(DAL.Models.Context context), de la création de la de la des objets dans le code et ensuite à l'aide de AddOrUpdate:

//Default Customers - create
var customers = new[]{
new Customer { Name = "cust_a" },
new Customer { Name = "cust_b" },
new Customer { Name = "cust_c" }
};
//Default Licenses - create
var licenses = new[]{
new License { DateCreated = DateTime.Now.AddDays(-3), Customer = customers[0] },
new License { DateCreated = DateTime.Now.AddDays(-2), Customer = customers[1] },
new License { DateCreated = DateTime.Now.AddDays(-1), Customer = customers[2] }
};
//Default ProductLicenses - create, and add default licenses
var productLicenses = new[]{
new ProductLicense { LicenceType = LicenseType.Annual, StartDate = DateTime.Now, License = licenses[0] },
new ProductLicense { LicenceType = LicenseType.Monthly, StartDate = DateTime.Now, License = licenses[1] },
new ProductLicense { LicenceType = LicenseType.PAYG, StartDate = DateTime.Now, License = licenses[2] }
};
//Default Permissions - create, and add default product licenses
var permissions = new[]{
new Permission { Name = "Super_a", ProductLicense = productLicenses[0] },
new Permission { Name = "Access_b", ProductLicense = productLicenses[1] },
new Permission { Name = "Access_c", ProductLicense = productLicenses[2] }
};
//Default Roles - create, and add default permissions
var roles = new[]{
new Role { Name = "Super_a", Permissions = permissions.Where(x => x.Name.Contains("_a")).ToList() },
new Role { Name = "User_b", Permissions = permissions.Where(x => x.Name.Contains("_b")).ToList() },
new Role { Name = "User_c", Permissions = permissions.Where(x => x.Name.Contains("_c")).ToList() }
};
//Default Users - create, and add default roles
var users = new[]{
new User { Username = "user@_a.com", Password = GenerateDefaultPasswordHash(), Salt = _defaultSalt, Roles = roles.Where(x => x.Name.Contains("_a")).ToList() },
new User { Username = "user@_b.co.uk", Password = GenerateDefaultPasswordHash(), Salt = _defaultSalt, Roles = roles.Where(x => x.Name.Contains("_b")).ToList() },
new User { Username = "user@_c.com", Password = GenerateDefaultPasswordHash(), Salt = _defaultSalt, Roles = roles.Where(x => x.Name.Contains("_c")).ToList() }
};
//Default Customers - insert, with default users
foreach (var c in customers)
{
c.Users = users.Where(x => x.Username.Contains(c.Name.ToLower())).ToList();
context.Customers.AddOrUpdate(c);
}

J'ai aussi essayé de changer la première partie à la suite de //Default Customers - create à

//Default Customers - create and insert
context.Customers.AddOrUpdate(
u => u.Name,
new Customer { Name = "C6" },
new Customer { Name = "RAC" },
new Customer { Name = "HSBC" }
);
context.SaveChanges();
var customers = context.Customers.ToList();

Je serais très heureux d'aider avec cela, afin que je puisse les graines de ma base de données avec les données appropriées.

Merci beaucoup pour votre aide, et désolé pour le long post.

--- Mise à JOUR ---

Après Chris Pratt est une excellente réponse ci-dessous maintenant, je reçois l'erreur suivante:
Conflicting changes detected. This may happen when trying to insert multiple entities with the same key.

Voici mon nouveau code pour le semis et tous les modèles concernés: https://gist.github.com/jacquibo/c19deb492ec3fff0b5a7

Quelqu'un peut-il aider?

OriginalL'auteur tekiegirl | 2014-10-24