public void Throws_for_multiple_identity_properties()
        {
            var modelBuilder = InMemoryTestHelpers.Instance.CreateConventionBuilder();

            modelBuilder.Entity <Dog>().Property(c => c.Type).UseMySqlIdentityColumn();
            modelBuilder.Entity <Dog>().Property <int?>("Tag").UseMySqlIdentityColumn();

            VerifyError(MySqlStrings.MultipleIdentityColumns("'Dog.Tag', 'Dog.Type'", nameof(Dog)), modelBuilder.Model);
        }
Пример #2
0
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        protected override void ValidateSharedColumnsCompatibility(IReadOnlyList <IEntityType> mappedTypes, string tableName)
        {
            base.ValidateSharedColumnsCompatibility(mappedTypes, tableName);

            var identityColumns  = new List <IProperty>();
            var propertyMappings = new Dictionary <string, IProperty>();

            foreach (var property in mappedTypes.SelectMany(et => et.GetDeclaredProperties()))
            {
                var propertyAnnotations = property.Relational();
                var columnName          = propertyAnnotations.ColumnName;
                if (propertyMappings.TryGetValue(columnName, out var duplicateProperty))
                {
                    var propertyStrategy          = property.MySql().ValueGenerationStrategy;
                    var duplicatePropertyStrategy = duplicateProperty.MySql().ValueGenerationStrategy;
                    if (propertyStrategy != duplicatePropertyStrategy &&
                        (propertyStrategy == MySqlValueGenerationStrategy.IdentityColumn ||
                         duplicatePropertyStrategy == MySqlValueGenerationStrategy.IdentityColumn))
                    {
                        throw new InvalidOperationException(
                                  MySqlStrings.DuplicateColumnNameValueGenerationStrategyMismatch(
                                      duplicateProperty.DeclaringEntityType.DisplayName(),
                                      duplicateProperty.Name,
                                      property.DeclaringEntityType.DisplayName(),
                                      property.Name,
                                      columnName,
                                      tableName));
                    }
                }
                else
                {
                    propertyMappings[columnName] = property;
                    if (property.MySql().ValueGenerationStrategy == MySqlValueGenerationStrategy.IdentityColumn)
                    {
                        identityColumns.Add(property);
                    }
                }
            }

            if (identityColumns.Count > 1)
            {
                var sb = new StringBuilder()
                         .AppendJoin(identityColumns.Select(p => "'" + p.DeclaringEntityType.DisplayName() + "." + p.Name + "'"));
                throw new InvalidOperationException(MySqlStrings.MultipleIdentityColumns(sb, tableName));
            }
        }
Пример #3
0
        public void Detects_multiple_identity_properties(bool obsolete)
        {
            var modelBuilder = CreateConventionalModelBuilder();

            modelBuilder.Entity <Dog>().Property(d => d.Id).ValueGeneratedNever();

            if (obsolete)
            {
#pragma warning disable 618
                modelBuilder.Entity <Dog>().Property(c => c.Type).UseMySqlIdentityColumn();
                modelBuilder.Entity <Dog>().Property <int?>("Tag").UseMySqlIdentityColumn();
#pragma warning restore 618
            }
            else
            {
                modelBuilder.Entity <Dog>().Property(c => c.Type).UseIdentityColumn();
                modelBuilder.Entity <Dog>().Property <int?>("Tag").UseIdentityColumn();
            }

            VerifyError(MySqlStrings.MultipleIdentityColumns("'Dog.Tag', 'Dog.Type'", nameof(Dog)), modelBuilder.Model);
        }